我正在尝试使用 Laravel 构建一些聊天系统,我有以下 2 个模型:用户和线程
用户模型具有 Messagable Trait,您可以在其中获取所有线程
$user->threads();
我正在尝试使用以下方法将附加数据急切加载到线程数组:
$threads = Auth::user()->threads()->with(['participants.user'])->get();
我正在努力的是 Threads 模型具有从中获取最新消息的功能:
$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();
我希望我澄清了这一点,因为我正在为这个系统使用 3rd 方包,其中包含我正在使用的这些 Traits 和 Thread 类。
解决方案
看起来我在获取集合时必须在最后添加 append('accessor_name') 。
$collection = Auth::user()->relationship()->get()->append('accessor_name');
答案 0 :(得分:1)
您可以覆盖类。创建新模型并扩展包模型
<?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