这是我想要预选的选择:
SELECT * FROM books AS b LEFT JOIN得分AS ON s.media_type_id = 1 AND s.media_id = b.id. ORDER BY s.sorting_score
我只使用Eloquent ORM(不是完整的框架)
在Book Model中:
public function score()
{
return $this->belongsTo('Score', 'scores', 'media_id','id');
}
是关系。
$books = Book::with(array('score' => function($query) use ($id)
{
$query->where('media_type_id','=',$id)->orderBy('sorting_score','ASC');
}))->get();
它没有产生相同的结果。
我有两个问题: 我的Eager Loading概念是错的吗? 如果是这样 - 我如何在Laravel中正确连接以模仿SQL。
答案 0 :(得分:1)
Eloquent
中的预先加载会运行另一个带有WHERE IN
子句的查询,因此可能不是您所期望的。
这是您构建该查询的方式:
$books = Book::leftJoin('scores s', 'scores.media_id', '=', 'books.id')
->where('s.media_type_id', '=', $typeId)
->orderBy('s.sorting_scores')
->get();
顺便说一下,关系定义是错误的。这应该是什么样子:
// Book model
public function score()
{
return $this->hasOne('Score', 'media_id');
// possibly this would be necessary too:
// ->where('media_type_id', 1); // assuming 1 for type Book
}
然后是另一种关系:
// Score model
public function book()
{
return $this->belongsTo('Book', 'media_id');
// ->where('media_type_id', 1);
}