【问题标题】:laravel Eager Load and limitlaravel 渴望负载和限制
【发布时间】:2021-08-11 11:03:05
【问题描述】:

我遇到了这个问题:我有人物模型和他们的活动模型,我想在人物模型中声明最近活动的关系,但是 Laravel 不允许使用“限制”或在Eager Loads 中“获取”

那么怎么做呢?

我在人模型中尝试过这个

public function lastActivity()
{
    return $this->belongsToMany('App\Models\Activity','activity_job','job_id','activity_id')
                ->orderByDesc('created_at')->limit(1);
}

但它需要一个人的最新活动不适合所有人???? 请帮忙

【问题讨论】:

    标签: laravel eloquent eager-loading laravel-relations


    【解决方案1】:

    假设您有一个模型 Person(或 People,无论如何......)

    (Person.php)

    class Person extends Model {
    
        protected $table = 'persons';
    
    
        public function activities()
        {
            return $this->hasMany(Activity::class);
        }
    
        ...
    }
    

    还有一个模型 Activity (Activity.php)

    class Activity extends Model {
    
        ...
    
        public function person()
        {
            return $this->belongsTo(Person::class);
        }
    
        ...
    }
    

    现在获取所有人员的最新活动

    Person::with(['activities' => function ($query) {
            $query->orderBy('id', 'desc');
        }])->get()
           ->map(function ($person) {
                $person->setRelation('activities', $person->activities->take(1));
                return $person;
            });
    

    说明: 我们得到所有人员的所有活动。然后我们通过集合映射并(重新)设置活动关系与活动集合中的一项。因为我们按 id 降序排列了活动,所以 take(1) 会为我们提供人员的最新活动。

    【讨论】:

    • 挂起时间过长,并给出如下错误:“允许的内存大小为 536870912 字节已用尽(尝试分配 8388616 字节)”
    • 使用 Laravel 调试栏显示 10.000 个人和 40.000 个活动需要大约 1.37 秒,内存使用量为 83 MB。显示 20 个分页条目需要约 28 毫秒,内存使用量约为 6MB
    • 检查 php.ini 中的内存限制或对结果进行分页。也许您的代码中的其他地方有错误。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2019-07-26
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多