Laravel Eager在Pivot

时间:2015-06-02 19:59:12

标签: php laravel laravel-5

我有一个Pivot表,用于连接另外两个每个hotel_id有很多关系的表。有没有办法可以加载关系,在一个关系中拉出两个表的结果?原始SQL查询正常工作,但在使用belongsToMany时,订单已关闭。

设置数据透视表

id
hotel_id 
distance_id
type_id

距离表

id
name

输入表格

id
name

RAW查询(此工作正常)

SELECT * FROM amenities a 
LEFT JOIN distance d ON a.distance_id = d.id 
LEFT JOIN type t ON a.type_id = t.id WHERE a.hotel_id = ?

我的“酒店”模型正在使用belongsToMany

public function distance() {
    return $this->belongsToMany('Distance', 'amenities', 'hotel_id', 'distance_id');
}
public function type() {
    return $this->belongsToMany('Type', 'amenities', 'hotel_id', 'type_id');
}

这会输出集合,但它们未正确分组。我需要将它们并排放入数据透视表中输入的选择字段中,这样用户就可以选择“类型”和“距离”,但在使用集合时,顺序是关闭的。上面的原始查询输出正确。

Hotels::where('id','=','200')->with('distance', 'type')->take(5)->get();

好的解决了。显然你可以在数据透视表上使用orderBy。如果其他人都有这个问题,这就是我在两种关系上所做的。

public function distance() {
    return $this->belongsToMany('Distance', 'amenities', 'hotel_id', 'distance_id')->withPivot('id')->orderBy('pivot_id','desc');
}
public function type() {
    return $this->belongsToMany('Type', 'amenities', 'hotel_id', 'type_id')->withPivot('id')->orderBy('pivot_id','desc');
}

2 个答案:

答案 0 :(得分:0)

使用 - > withPivot(' id') - > orderBy(' pivot_id',' desc')解决;

在问题中发表回答。

答案 1 :(得分:0)

在模型的关系方法中包含其他查询构建步骤并不是一个很好的做法。关系方法应该只定义关系,没有别的。更简洁的方法是应用eager load constraints。 (向下滚动一下)考虑以下内容。

Hotels::where('id', 200)->with(array(
    'distance' => function ($query)
    {
        $query->withPivot('id')->orderBy('pivot_id','desc');
    },
    'type' => function ($query)
    {
        $query->withPivot('id')->orderBy('pivot_id','desc');
    },
))->take(5)->get();

如果您发现经常以这种方式急切地加载这种关系,请考虑使用scopes来保持干燥。最终结果将允许你做这样的事情。

Hotels::where('id', 200)->withOrderedDistance()->withOrderedType()->take(5)->get();

P.S。你的模型应该是单一的。酒店,而不是酒店。该模型代表单个记录。