Laravel用户模型条件急切加载(with)



我正在用Laravel和Vue构建一个混合应用程序。我有一个用例,不是所有的用户都有特定的关系。例如,客户端可以有一个和多个业务单位

目前我已经这样设置了:

<?php
namespace AppModels;
use LaravelSanctumHasApiTokens;
use SpatieMediaLibraryHasMedia;
use IlluminateNotificationsNotifiable;
use Lab404ImpersonateModelsImpersonate;
use SpatieMediaLibraryInteractsWithMedia;
use IlluminateDatabaseEloquentCastsAsArrayObject;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable implements HasMedia
{
use TraitsBaseModelTrait;
use TraitsActiveTrait;
use InteractsWithMedia;
use Impersonate;
use HasApiTokens;
use Notifiable;
use HasFactory;
protected $hidden = [
'password', 'remember_token',
];
protected $fillable = [
'name', 'email', 'password', 'avatar',
];
protected $casts = [
'settings' => AsArrayObject::class,
'is_admin' => 'boolean',
];
protected $with = [
'domain',
'BusinessUnits'
];
public function scopeAdmin($query)
{
return $query->where('is_admin', true);
}
public function scopeEmployee($query)
{
return $query->whereNull('domain_id');
}
public function scopeClient($query)
{
return $query->whereNotNull('domain_id');
}
public function BusinessUnits()
{
return $this->belongsToMany(BusinessUnit::class, 'users_business_units_pivot');
}
public function Domain()
{
return $this->belongsTo(Domain::class);
}
}

"problem"使用这种方法,对于每个请求,每个用户执行2个查询。我希望仅当"domain_id"不为空(scopeClient)。对于正常的"模型"我可以选择每个页面应该加载什么模型等,但对于经过身份验证的用户来说,这是不可能的。

我想我在找这样的东西:

protected $with = [
(!$this->domain_id) ? 'domain' : null,
(!$this->domain_id) ? 'BusinessUnits' : null
];

当前生成错误:"常量表达式包含无效操作。">

任何建议或想法来解决这个问题,将不胜感激!

您可以尝试使用events:

// this code should be inside your model
public static function boot()
{
parent::boot();
self::retrieved(function($model){
if($model->domain_id !== null)
{
$model->load('domain', 'BusinessUnits');
}
});
}

显然,你必须从$with

中删除这些关系

获取所有拥有域的用户,使用whereHas()

$users = User::whereHas('Domain')->with(['Domain', 'BusinessUnits'])->get();

它将启动3个查询,一个用于用户,一个用于域,一个用于业务单位。

相关内容

最新更新