Laravel - 预加载模型函数

Laravel - Eager loaded model function

我正在尝试使用 Laravel 构建一些聊天系统,我有这两个模型:用户和线程

User 模型具有 Messagable Trait,您可以在其中获取所有线程

$user->threads();

我正在尝试使用以下方法将额外的数据加载到线程数组中:

$threads = Auth::user()->threads()->with(['participants.user'])->get();

我正在努力的是线程模型具有从中获取最新消息的功能:

$thread->getLatestMessage();

我的问题是如何将这条最新消息附加到我正在执行的上层查询中。我正在尝试这样的事情,但不行...我想我在这里做了一些愚蠢的事情...

$threads = Auth::user()->threads()->with([
        'participants.user',
        'latestMessage' => function ($query) {
            return $query->getLatestMessageAttribute();
        }])->get();

$threads = Auth::user()->threads()->with(['participants.user','getLatestMessageAttribute'])->get();

我希望我澄清了这一点,因为我正在为这个系统使用第 3 方包,它具有我正在使用的这些特征和线程 类。

解决方案

看起来我必须在获取集合时在最后添加 append('accessor_name')。

$collection = Auth::user()->relationship()->get()->append('accessor_name');

您可以覆盖 class。创建新模型并扩展包模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;


class Thread extends \Lexx\ChatMessenger\Models\Thread
{
    use HasFactory;

    protected $appends=['latest_message'];
    

}

发布配置:

php artisan vendor:publish --provider="Lexx\ChatMessenger\ChatMessengerServiceProvider" --tag="config"

config/chatmessenger.php

'thread_model' => \App\Models\Thread::class,

已更新 如果仍然没有获取属性数据,请不要忘记清除缓存

php artisan cache:clear

php artisan optimize

php artisan config:clear

php artisan clear