如何在Yii2中使用leftJoin从两个表中获取所有列数据

时间:2018-10-27 18:20:38

标签: php sql yii2

我试图在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中不可能吗?

2 个答案:

答案 0 :(得分:2)

在您的select子句->select("authors.Name, books.id")中,您没有列authors.id,因此不会从db中检索这些列。

所以也尝试添加此列
并使用适当的别名(例如:autors_id

)来确定您还有另一个id引用列的事实
$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的选择结果

答案 1 :(得分:0)

默认情况下,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";
}