【问题标题】:Laravel Relationship Eager Loading belongsTo incorrectLaravel 关系渴望加载属于不正确
【发布时间】:2014-06-24 22:10:25
【问题描述】:

我有一张叫书的桌子。 我有一个名为 scores 的表,它基于 100 的度量。

这是我希望进行的选择:

SELECT * FROM books AS b LEFT JOIN 得分为 s ON s.media_type_id = 1 AND s.media_id = b.id ORDER BY s.sorting_score

我只使用 Eloquent ORM(不是完整的框架)

内书模型:

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();

它不会产生相同的结果。

我有两个问题: 我的渴望加载的概念是错误的吗? 如果是这样 - 我如何在 Laravel 中适当地加入以模仿 SQL。

【问题讨论】:

    标签: sql laravel laravel-4 eloquent


    【解决方案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);
    }
    

    【讨论】:

    • 你能解释一下为什么 belongsTo 是错误的,而是 hasOne。
    • 这是belongsTo 的倒置。基本上当您在scores 上引用Book 的键时,我们可以说Book 有一个(或多个)Scores,所以Score 属于Book
    • 但是分数是唯一有关系的——书没有分数表就没有直接关系。这还能用吗?
    • 检查编辑。我想这就是你需要的。尽管如此,我给你的查询生成器仍然可以工作。另请阅读多态关系:laravel.com/docs/eloquent#polymorphic-relations
    • 感谢您的编辑 - 它解释了更多。我在文档上跑了圈,我希望他们能把 SQL 翻译成 Eloquent。
    猜你喜欢
    • 2018-11-07
    • 2019-06-19
    • 2014-02-24
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2016-08-18
    相关资源
    最近更新 更多