php - Laravel 从查询 Eloquent 结果中排除当前 id

标签 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]);
   }

最佳答案

解决您的问题的一种简单方法是直接使用 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 关系以及查询构建器如何工作的更多信息:

但是,您处理它的方式可能会导致一些问题。

根据您的代码,我可以假设ProjectTag 之间的关系是多对多 关系,这可能会导致重复结果项目共享超过 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/

相关文章:

具有左连接条件的 MySQL case 语句

php - 在 Laravel 4 中为现有数据库创建迁移

php - Laravel 5.1 将 Eloquent 关系应用于模型会引发 Tinker 中未找到的类

javascript - 如何在给定格式的 HTML 列表中显示 jQuery 数据值?

php - 包括远程 HTML 文件

javascript - 如何上传 xml 文件并发送到 php 服务器

javascript - 动态行值错误地更新到 mysql php

php - 每发布三篇文章后重新运行循环? (WordPress)

PHP处理大字符串

php - 购买后如何更新数据库中的用户?