我需要编写一个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?
答案 0 :(得分:0)
您可以为此使用groupBy()
:
$books = Books::find()->groupBy(['isbn'])->all();
但是这将返回具有匹配的isbn
值的随机行,并且可能在某些DBMS中不起作用。您的要求太含糊,无法以可预测的方式处理它。但是,如果您始终希望第一行,则可以使用子查询来获取匹配的isbn
和id
:
$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();