我是 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]);
}
最佳答案
解决您的问题的一种简单方法是直接使用 Relationship
方法而不是通过属性引用它,您可以像任何 Eloquent 交易一样添加额外的过滤器。
换句话说,您需要替换它:
Tag::find($tag_ids)->projects
有了这个:
Tag::find($tag_ids)->projects()->where('id', '!=', $id)->get()
其中$id
是当前项目的id。这背后的原因是,通过使用方法 projects()
,您直接引用了模型定义的 Relationship
(很可能是 BelongsToMany
,判断通过你的代码),它可以用作查询生成器(就像扩展 laravel 自己的 Eloquent\Model
的任何模型实例一样)。
您可以在此处找到有关 Laravel 关系以及查询构建器如何工作的更多信息:
但是,您处理它的方式可能会导致一些问题。
根据您的代码,我可以假设Project
和Tag
之间的关系是多对多 关系,这可能会导致重复结果项目共享超过 1 个标签(正如用户 Ohgodwhy 所述)。
在这种情况下,最好使用 laravel 的 whereHas()
方法,它可以让您根据模型关系中的条件直接过滤结果(您可以找到有关其工作原理的更多信息在我为 Eloquent 关系提供的链接上)。您必须执行以下操作:
// 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();
这样您就可以排除当前项目,同时避免结果中出现任何重复项。
关于php - Laravel 从查询 Eloquent 结果中排除当前 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37738175/