Cru*_*ito 4 php mysql laravel eloquent
我对 Laravel 相当陌生,我建立了一个“类似帖子”部分。所以每个帖子都有一个标签,我从当前标签中查询所有 id。然后我找到了所有带有这些 ID 的帖子。现在我的问题是始终包含当前帖子。查询时是否有一种简单的方法可以排除当前 id?
我似乎在 laravel 文档站点上的辅助函数中找不到任何内容
这是我的功能:
public function show($id)
{
$project = Project::findOrFail($id);
foreach ($project->tags as $tag){
$theTag = $tag->name;
}
$tag_ids = DB::table('tags')
->where('name', "=", $theTag)
->value('id');
$similarProjects = Tag::find($tag_ids)->projects;
return view('projects.show', ['project' => $project, 'similarProjects' => $similarProjects]);
}
Run Code Online (Sandbox Code Playgroud)
解决您的问题的一种简单方法是Relationship直接使用该方法,而不是通过属性引用它,您可以像任何 eloquent 事务一样添加额外的过滤器。
换句话说,你需要替换这个:
Tag::find($tag_ids)->projects
Run Code Online (Sandbox Code Playgroud)
有了这个:
Tag::find($tag_ids)->projects()->where('id', '!=', $id)->get()
Run Code Online (Sandbox Code Playgroud)
$id当前项目的 id在哪里。这背后的原因是,通过使用 method projects(),您将Relationship直接引用您的模型定义(最有可能是 a BelongsToMany,根据您的代码判断),它可以用作查询构建器(就像任何扩展 laravel 自己的模型实例一样Eloquent\Model)。
您可以在此处找到有关 Laravel 关系以及查询生成器如何工作的更多信息:
但是,您处理它的方式可能会导致一些问题。
从您的代码中,我可以假设Project和之间的关系Tag是多对多关系,这可能会导致共享超过 1 个标签的项目出现重复结果(正如用户Ohgodwhy 所述)。
在这种情况下,最好使用 laravel 的whereHas()方法,它可以让您根据模型关系中的条件直接过滤结果(您可以在我为 eloquent-relationships 提供的链接上找到有关它如何工作的更多信息)。您必须执行以下操作:
// Array containing the current post tags
$tagIds = [...];
// Fetch all Projects that have tags corresponding to the defined array
Project::whereHas('tags', function($query) use ($tagIds) {
$query->whereIn('id', $tagIds);
})->where('id', !=, $postId)->get();
Run Code Online (Sandbox Code Playgroud)
这样您就可以排除当前项目,同时避免结果中出现任何重复项。
| 归档时间: |
|
| 查看次数: |
11727 次 |
| 最近记录: |