Laravel雄辩地加入IN子句

时间:2019-02-05 22:04:11

标签: php mysql laravel

我目前正在尝试使用Eloquent查询构建器来创建具有多个子句的联接,其中一个是IN子句。

我要创建的查询类型为

image: python:2.7.13

clone:
  depth: full

pipelines:

  branches:
    master:
      - step:
          script:
            - git push "https:/...

我尝试过

SELECT * FROM trusts t
    LEFT JOIN trust_group tg ON tg.trust_id = t.id
        AND tg.group_id IN (1,2,4)

这将导致

->leftJoin('trust_group', function($join) {
    $join->on('trust_group.trust_id', '=', 'trusts.id');
    $join->on('trust_group.group_id', 'IN', [1,2,4]);
})

我也尝试过

and `trust_group`.`group_id` = `IN`

但这会导致查询中包含类似

的内容
->leftJoin('trust_group', function($join) {
    $join->on('trust_group.trust_id', '=', 'trusts.id');
    $join->on(DB::raw('trust_group.group_id IN (1,2,4)'));
})

(显然,这些组ID是出于示例目的,并且是动态的)

口才可以在联接中支持IN子句吗?

这只是相当大的查询的一部分,因此宁愿使用联接而不是使用and trust_group.group_id IN (1,2,4) = ``

2 个答案:

答案 0 :(得分:1)

由于目前这是一个僵局,因此我将其发布为答案,直到正式PRed。不幸的是,尚未正式支持使用In子句进行连接。 closed thread

中有一些讨论

您可以将其用作原始查询:

<?php 

$results = DB::select("
            SELECT * FROM trusts t
            LEFT JOIN trust_group tg ON tg.trust_id = t.id
                AND tg.group_id IN (?)", $groupIds);

如果您想从结果数组中获得大量信息,还可以使用Model::hydrate($array)方法。

答案 1 :(得分:1)

这是一篇很老的帖子,但对于任何搜索者,您现在可以简单地使用 where 函数来构建更复杂的连接(在 Laravel 7 中测试):

->leftJoin('trust_group', function($join) {
    $join
        ->on('trust_group.trust_id', '=', 'trusts.id')
        ->whereIn('trust_group.group_id', [1, 2, 4])
    ;
})