我有一个DB表,它存储我的职务,以免重复,而且职务模型内部有关系,所以当我使用Eloquent模型时,我必须反复调用或加载职务模型。是否有一种方法可以始终使用内部预装了职务的职务模型?
class Job extends Model
{
use Notifiable;
protected $fillable = [ ... ];
protected $hidden = [
'token',
];
public function title()
{
return $this->belongsTo('AppModelsJobTitle','job_title_id');
}
public function people()
{
return $this->belongsToMany('AppModelsPerson','job_person','job_id','person_id');
}
}
这是职务模型
class JobTitle extends Model
{
use Notifiable;
protected $table = "job_titles";
protected $primaryKey = 'job_title_id';
protected $fillable = [
'name',
];
protected $hidden = [
'token',
];
public function jobs()
{
return $this->hasMany('AppModelsJob','job_title_id');
}
}
现在我在控制器内部的代码看起来是这样的:
$job = Job::all()->load('title');
它工作得很好,但当我打电话给的工作人员时
$personJobs = Person::find(1)->jobs()->load('title')->get();
给出错误,有什么想法吗?
始终使用内部预加载JobTitle的作业模型。可以在作业模型中添加$with
属性:
class Job extends Model
{
use Notifiable;
protected $with = ['title'];
}
load()
在执行查询后执行。这叫做懒惰加载。热切加载使用with()
。
热切加载通常比懒惰加载快(我可能错了,如果我错了,请纠正我(。
此外,使用jobs()
或任何其他关系,这将返回关系对象本身,而通过->Jobs
访问它将执行关系查询,并返回集合(如果有多个(或模型(如果有一个(。
CCD_ 6不起作用的原因是;作业hasMany关系将加载";标题";因为CCD_ 7没有CCD_。
所以如果你想解决这个问题,你可以做Person::with('jobs.title')->find(1)
或Person::find(1)->load('jobs.title')
当通过方法$person->jobs()
调用关系时,您最终会得到一个查询生成器,因此您不能调用像load()
这样的模型方法,因为您没有模型的实例。
在得到第一个结果(嵌套的热切加载(之前调用关系会更有效
$person = Person::with('jobs.title')->find(1);
$personJobs = $person->jobs;
如果你不想从数据库中查询个人数据,你应该使用whereHas
$personJobs = Job::whereHas('people', function($personQueryBuilder) {
$personQueryBuilder->where('id',1);
})->with('title')->get();