嵌套查询,Laravel

时间:2015-06-10 21:36:21

标签: laravel laravel-5

如何在Laravel

中的eloquent或查询构建器中编写以下查询
SELECT *
FROM   creatives
WHERE  creative_id IN (SELECT   creative_id
                   FROM     term_relationships
                   WHERE    term_id IN (1, 2, 3)
                   GROUP BY creative_id
                   HAVING   COUNT(*) = 3)

我的db模型具有为上述两个表定义的关系。这是2个表结构

Table 1: creatives
creative_id       creative_name
  1                xyz
  2                pqr
  3                abc

Table 2: term_relationships
creative_id       term_id
  1                1
  1                2
  1                3
  2                1
  2                2
  2                4

我还需要对结果进行分页。

1 个答案:

答案 0 :(得分:1)

对于更复杂的查询,特别是如果你已经构建了sql查询,我建议使用laravel的DB::statement函数而不是eloquent。

DB::statement('
    SELECT *
    FROM   creatives
    WHERE  creative_id IN (
        SELECT   creative_id
        FROM     term_relationships
        WHERE    term_id IN (1, 2, 3)
        GROUP BY creative_id
        HAVING   COUNT(*) = 3
    )

');

如果你真的喜欢Eloquent,这可以起作用:

Creatives::WhereIn('creative_id', function($query) {
    $query->select('creative_id')
          ->from('term_relationships')
          ->whereIn('term_id', array(1, 2, 3))
          ->groupBy('creative_id')
          ->havingRaw('COUNT(*) = 3');
})->get();