Laravel Relationship Eager正在加载所以不正确

时间:2014-06-24 22:10:25

标签: sql laravel laravel-4 eloquent

我有一张叫做书的桌子。 我有一个名为分数的表,它基于100的度量标准。

这是我想要预选的选择:

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。

1 个答案:

答案 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);
}