如何使用Yii2中的left join从两个表中获取所有列数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Yii2中的left join从两个表中获取所有列数据相关的知识,希望对你有一定的参考价值。

我试图在Yii2中使用books.id在阵列中获得authors.NameleftJoin()

$data = Book::find()
       ->select("authors.Name, books.id")
       ->leftJoin("authors", "authors.book_id = books.id")
       ->where(['books.id' => '14,16,17,18'])
       ->all();

但这个结果只来自books表。我在这个结果中看不到authors.Name

在Laravel中,很容易获得如上所述的数据。在Yii2中不可能吗?

答案

默认情况下,all()返回相关模型的数组,通常此模型无法表示此类查询的结果(例如Book模型没有Name字段)。通常最好使用asArray() - 然后all()将返回数组列表(可以存储查询返回的任何类型的键值对)而不是AR对象:

$data = Book::find()
    ->select('authors.Name, books.id')
    ->leftJoin('authors', 'authors.book_id = books.id')
    ->where(['books.id' => '14,16,17,18'])
    ->asArray()
    ->all();

foreach ($data as $row) {
    echo "{$data['id']} - {$data['Name']}\n";
}

或直接使用Query

$data = (new Query())
    ->select('authors.Name, books.id')
    ->from(Book::tableName())
    ->leftJoin('authors', 'authors.book_id = books.id')
    ->where(['books.id' => '14,16,17,18'])
    ->all();

foreach ($data as $row) {
    echo "{$data['id']} - {$data['Name']}\n";
}
另一答案

在您的select子句->select("authors.Name, books.id")中,您没有列authors.id,然后列不会从db中重新获取。

所以尝试添加此列 并使用适当的别名(例如:autors_id)为列提供另一个id referer

$data = Book::find()
       ->select("authors.Name, books.id, authors.id as authors_id")
       ->leftJoin(authors, "authors.book_id = books.id")
       ->where(['books.id' => '14,16,17,18'])
       ->all()

并确保您具有与作者列名相同的确切名称(通常列名称为小写)

 ->select("authors.name as authors_name, books.id, authors.id as authors_id")

并确保您有一个对应的字段来接收author_name和author_id的选择结果

以上是关于如何使用Yii2中的left join从两个表中获取所有列数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL JOINSQL INNER JOIN 关键字SQL LEFT JOIN 关键字SQL RIGHT JOIN 关键字SQL FULL JOIN 关键字

left join 需要distinct吗

从 LEFT JOIN 中选择最大的行

如何在没有重复的情况下在 hive 中执行 LEFT OUTER JOIN 以仅检查右表中的一个值?

sql语句中join、left join 、right join有啥区别?

SQL语句(inner join,left out join,right out join三者的不同