Laravel 从查询 eloquent 结果中排除当前 id

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)

Eri*_*cDS 6

解决您的问题的一种简单方法是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)

这样您就可以排除当前项目,同时避免结果中出现任何重复项。