Yii2:具有不同查询的ActiveRecord

时间:2017-05-10 20:52:12

标签: php mysql activerecord yii2

我需要编写一个ActiveRecord查询,我在一个字段中获取所有行的字段而没有重复。

示例:这是一本书籍表。我想获取行的所有数据 明显的isbn。从重复开始,应该采用第一行。结果应该是id为1,2,4

的行
id  | title   | isbn
--- | ------- | ------
1   | hello   | 1001
2   | world   | 1002
3   | this    | 1002
4   | is      | 1003
5   | funny   | 1003

我的第一次尝试是

$books = Books::find()->select('isbn')->distinct()->all();

但只填充$books[0], $books[1], ...中的isbn字段。

这是否可以使用Yii2 ActiveRecord?

2 个答案:

答案 0 :(得分:0)

您可以为此使用groupBy()

$books = Books::find()->groupBy(['isbn'])->all();

但是这将返回具有匹配的isbn值的随机行,并且可能在某些DBMS中不起作用。您的要求太含糊,无法以可预测的方式处理它。但是,如果您始终希望第一行,则可以使用子查询来获取匹配的isbnid

$query = (new Query())
    ->select(['MIN(id) as id, isbn'])
    ->from(Books::tableName())
    ->groupBy(['isbn']);
return Books::find()
    ->alias('book')
    ->innerJoin(['subquery' => $query], 'book.id = subquery.id AND book.id = subquery.id')
    ->all();

答案 1 :(得分:-3)

Yii2中针对不同属性的描述如下:

  

是否仅选择数据的不同行。如果将其设置为true,则SELECT子句将更改为SELECT DISTINCT。
  -https://www.yiiframework.com/doc/api/2.0/yii-db-query#$distinct-detail

因此,如果需要按以下方式选择'isbn'的不同值,则应使用true属性传递true:

$books = Books::find()->select('isbn')->distinct(true)->all();