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

标签: MySQL PHP laravel
发布时间: 2017/4/9 22:05:05
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我是相当新的 laravel 和建立了有点类似文章"一节。所以每个帖子都标记和我查询所有 id 的从当前标记。然后我找到这些 id 的所有职位现在我的问题是当前职位是总是包括在内。有简单的方法时要排除的当前 id 查询吗?

我似乎无法找到任何在 helper 函数 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]);
   }

解决方法 1:

简单的方法来解决您的问题将是使用 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() 方法,允许您筛选结果直接基于一个条件从您的模型的关系 (你可以找到更多的信息关于它是如何工作的链接我为雄辩关系提供)。您将必须执行以下操作︰

// 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();

这种方式,同时避免任何重复结果中的,您可以排除你当前的项目。

官方微信
官方QQ群
31647020