如何通过急切加载仅访问相关模型

时间:2017-12-06 05:22:14

标签: php laravel orm eloquent

我的项目中有这些模型:

class User {

    public function favorites()
    {
        return $this->hasMany('App\Favorite');
    }

}

-

class Product {

    public function user()
    {
        return $this->belongsTo('App\User');
    }

}

-

class Favorite {

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function product()
    {
        return $this->belongsTo('App\Product');
    }

}


当我试图获得用户的最爱时,我会这样做: -

$user = User::find(1);
return $user->favorites;

或者用他最喜欢的产品: -

return $user->favorites->load('product');

但它返回两者(产品和收藏夹)的结果。

如何仅通过收藏夹从产品型号获取结果?     

就像我只想检索用户添加到他最爱的产品一样?

我已经尝试在User类中创建它并且它不起作用: -

public function favproducts()
{
    return this->hasManyThrough('App\Product', 'App\Favorite');
}


提前谢谢。

3 个答案:

答案 0 :(得分:2)

这似乎可以是UIViewControllerbelongsToMany之间的User来制作“收藏夹”,作为数据透视表。

您当前的设置缺少从ProductProduct的反向关系,因此您无法在该方向上使用该关系。这是我用来获得你想要的结果的方向。

如果你有关系设置,你可能会这样做只是为用户的收藏夹获取产品。

Favorite

获取具有Product::whereHas('favorites.user', function ($q) use ($user_id) { $q->where('id', $user_id); })->get(); 用户喜爱的所有产品。

如果为id == $user_id设置了此项,则可能只需执行此操作:

belongsToMany

根据您目前拥有的内容,您可以从PHP端的结果中“获取”子记录。

答案 1 :(得分:0)

试试这个: 在你的情况下,我认为这是一个嵌套的渴望加载

$user = User::with('favorites.product')->get();
//to grab the data
dd($user->favorites[0]->product);

希望它有所帮助

答案 2 :(得分:-1)

尝试:

$user->favorites->product['name']