所以我有2种模式,User和Profile,关系设置如下:
/**
* User belongs to many Profile
*
* @return \Illuminate\Database\Eloquent\Relations\belongsToMany
*/
public function profiles()
{
return $this->belongsToMany('App\Models\Profile', 'user_profiles');
}
我有 3 个表、用户、配置文件和用户配置文件(数据透视表)
我的用户表中有一个名为active_profile
其中填充有配置文件 ID。
我怎样才能建立关系,以便我可以调用如下所示的内容:
$user->active_profile
这样它就会返回active_profile中设置的id的所有配置文件信息?
在 Laravel 5.8 上,因为我想将它与急切加载我用了这个包:https://github.com/staudenmeir/eloquent-has-many-deep https://github.com/staudenmeir/eloquent-has-many-deep
这是我的场景
可以在多张照片上标记一个用户,并且一张照片可以有许多用户标记。我想建立一种关系来获取用户被标记的最新照片。
我认为我的场景也可以应用于任何多对多关系
我做了枢轴模型用户照片
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\Pivot;
class UserPhoto extends Pivot
{
public function user()
{
return $this->belongsTo(User::class);
}
public function photo()
{
return $this->belongsTo(Photo::class);
}
}
然后在我的User模型使用施陶登梅尔的包裹:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;
class User extends Model
{
use HasRelationships;
public function photos()
{
return $this->belongsToMany(Photo::class);
}
public function latestPhoto()
{
return $this->hasOneDeep(Photo::class, [UserPhoto::class])
->latest();
}
}
然后我可以轻松地做这样的事情:
User::with('latestPhoto')->get()
and $user->latestPhoto
编辑:
在另一个问题中,有人在没有使用包的情况下问了同样的问题。
我还提供了一个答案 https://stackoverflow.com/a/59303547/8068675这会产生相同的结果。
但深入挖掘之后,从这两个答案中,您可以避免 n+1 查询,您仍然会水合来自您请求的用户的所有照片。我认为不可能避免其中一种方法。不过,缓存可能是一个答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)