【问题标题】:Eloquent query to search over two tables雄辩的查询来搜索两个表
【发布时间】:2018-06-01 13:13:46
【问题描述】:

我在 Laravel 5.6 中使用 Eloquent 处理以下查询。

我需要返回分配了5tag_id 的所有问题,其中问题表中的project_iditem_id 与我的数据透视表中的project_idissue_id 匹配。

问题表:

issues_tags 数据透视表:

我尝试了以下代码,但它返回问题表中的所有问题,但预期是 3 个结果。

预期结果

issues 表返回的结果应该是 ID 1、4 和 5。

$issues = Issue::join('issues_tags', 'issues_tags.project_id', 'issues_tags.issue_id')->where('issues_tags.tag_id', 5)->select('issues.*')->get();

【问题讨论】:

  • 试试leftJoin而不是join
  • 产生相同的结果。
  • 您可以使用toSqlgetQueryLog 方法查看SQL 查询是否正常?
  • $issues = Issue::join('issues_tags', 'issues.project_id', 'issues_tags.project_id')->join('issues_tags', 'issues.item_id', 'issues_tags.issue_id')->where('issues_tags.tag_id', 5)->select('issues.*')->get();
  • 你能告诉我们预期的结果吗?

标签: php mysql laravel eloquent


【解决方案1】:

您需要在连接上指定问题表而不是问题标签。左连接也将有助于减少结果。由于您要加入两个不同的键,因此您必须使用闭包。

$issues = Issue::leftJoin('issues_tags', function($join) {
    $join->on('issues.project_id', '=', 'issues_tags.project_id');
    $join->on('issues.item_id', '=', 'issues_tags.issue_id');
})
->where('issues_tags.tag_id', 5)->select('issues.*')->get();

如果表确实应该在 project_id->project_id 和 issues.id -> issues_tags.issues_id 上匹配,则可以修改第二个连接子句。

【讨论】:

  • 这个解释很有道理。我在您的代码中修复了与缺少引号和使用单数 issues_tags.issue_id 相关的几个问题,并且它起作用了。谢谢!
  • issues_tags.issues_id 只需删除 s ,应该是 issue_id。现在它的工作完美
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2019-12-19
  • 2015-02-02
  • 2018-07-26
  • 2018-07-01
  • 2021-05-12
  • 2019-06-22
相关资源
最近更新 更多