【问题标题】:Yii2: how to use subquery with ActiveRecord?Yii2:如何在 ActiveRecord 中使用子查询?
【发布时间】:2021-01-23 20:06:31
【问题描述】:

我想创建一个查找函数,然后在 GridView 小部件中使用我我不知道如何使用子查询。

这是我拥有的 PostgreSQL 查询的简单版本:

SELECT color
FROM cars
LEFT JOIN (
    SELECT name
    FROM companies
)

这是我尝试但不起作用的方法:

$query = Cars::find()
    ->select([
        'color' => '
            SELECT name     // Problem here.
            FROM companies  // Problem here.
        ',
    ]);

【问题讨论】:

标签: sql postgresql activerecord yii2 subquery


【解决方案1】:

您的预期查询不是您要执行的操作。您可以将自定义子查询添加为

$query = Cars::find()
    ->select([
       '(SELECT name FROM companies) AS xxx'
    ]);

但是,如果您想将连接表中的字段添加到网格中,那么您应该定义一个关系,然后您可以轻松地将这样的列添加到您的网格中。见https://www.yiiframework.com/doc/guide/2.0/en/db-active-record#relational-data

【讨论】:

    【解决方案2】:

    您可以像这样在leftJoin() 方法中使用ActiveQuery 的实例:

    $subQuery = Companies::find()
        ->select('name', 'id'); //I've added ID to show how to write on condition
    $query = Cars::find()
        ->select('color')
        ->leftJoin(
            ['alias' => $subQuery],
            'alias.id = cars.company_id'
        );
    

    有关leftJoin()join() 方法的更多详细信息,请参阅documentation

    【讨论】:

      【解决方案3】:
      $query = Cars::find()
          ->select(['cars.color','companies.name'])
          ->leftJoin('companies', 'cars.company_id = companies.id');
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多