微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有预加载关系的 Laravel 模型

如何解决具有预加载关系的 Laravel 模型

我有一个 DB 表来存储我的职位,以免重复它们,并且 Job 模型在内部有关系,所以当我使用 Eloquent 模型时,我必须总是一遍又一遍地调用或加载 JobTitles 模型。有没有办法始终使用带有预加载 JobTitles 的 Job Model?

    class Job extends Model
    {
        use Notifiable;

        protected $fillable = [ ... ];

        protected $hidden = [
        'token',];


    
        public function title()
        {
            return $this->belongsTo('App\Models\JobTitle','job_title_id');
        }

        public function people()
        {
            return $this->belongsToMany('App\Models\Person','job_person','job_id','person_id');
        }
        
    }

这是JobTitle模型

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('App\Models\Job','job_title_id');
    }

    
}

现在我在控制器中的代码如下所示:

 $job = Job::all()->load('title');

它工作正常,但当我打电话给人们时

 $personJobs = Person::find(1)->jobs()->load('title')->get();

给出错误,知道这是如何完成的吗?

解决方法

当通过方法 $person->jobs() 调用关系时,您最终会得到一个查询构建器,因此您可以调用模型方法,如 load(),因为您没有模型的实例。

在得到第一个结果 (nested eager loading) 之前调用关系会更有效率

$person = Person::with('jobs.title')->find(1);
$personJobs = $person->jobs;

如果你不想从数据库中查询人物数据,你应该使用 whereHas

$personJobs = Job::whereHas('people',function($personQueryBuilder) {
    $personQueryBuilder->where('id',1);
})->with('title')->get();
,

load() 在查询执行后执行。这称为延迟加载。 Eager loading 正在使用 with()

急切加载通常比延迟加载更快(我可能错了,如果我错了,请纠正我)。

此外,使用 jobs() 或任何其他关系,这将返回关系对象本身,而通过 ->Jobs 访问它将执行关系查询并返回一个集合(如果有多个)或模型(如果有的话)。

$personJobs = Person::find(1)->jobs()->load('title')->get(); 不起作用的原因是因为您本质上是在说“jobs hasMany 关系将加载不起作用的“title”,因为 hasMany 没有 { {1}} 函数。

所以如果你想解决这个问题,你可以做load()Person::with('jobs.title')->find(1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。