【问题标题】:get first element from relationship eloquent从关系中获取第一个元素 eloquent
【发布时间】:2020-09-12 17:57:47
【问题描述】:

我有一个关于查询的问题,我如何在 Laravel 中从关系 hasMany 中获取第一个元素,我有一个包含关系 hasMany 消息的聊天表,我尝试使用这个,以及 take() 和 limit(),但是没有成功

$chats = Chat::with(['messages' => function ($query) {
    $query->first();
}])->get();

【问题讨论】:

  • 你不能反过来做吗,Message::orderBy('id', 'desc')->first()->chat?
  • 不,我需要通过他们的第一条消息获取所有聊天记录,通过该查询,我只收到来自 db 和他的关系聊天记录的第一条消息
  • 我明白了。您可以创建一个新的关系,如“firstMessage”,并在关系本身中有一个 ->first()

标签: laravel eloquent


【解决方案1】:

我认为,它可能存在另一个好的解决方案,但有了这个我可以做出我想要的

聊天模型类:

public function firstMessage()
{
    return $this->hasOne(Message::class);
}

来自控制器的查询:

Chat::with('firstMessage')->get();

【讨论】:

  • 这就是我一直在寻找的,它成功了!每个元素一个。出于某种原因,使用其他答案中建议的 limit(1) 只为所有查询的元素返回一个关系元素,而不是为每个元素返回一个。
  • 太优雅了。谢谢?
【解决方案2】:

我建议为此创建一个单独的属性并在其中包含逻辑。所以这是在 Chat 类中:

public function getFirstMessageAttribute() 
{
    return $this->hasMany(Message::class)->orderBy('id', 'desc')->first();
}

然后你可以这样称呼它:

$chats = Chat::with('messages')->get();
$chats[0]->firstMessage; //

【讨论】:

  • Chat::with('firstMessage')->get()
  • 但是如果我想做一个大查询,像这样php Chat::with('firstMessage')->get(); 它会产生这个错误 Call to undefined method App\Message::addEagerConstraints()
  • 您确定将关系代码添加到 Chat 类中吗?
  • 是的,我和其他模特还有 6 个关系,但没有错
  • 更新了答案
【解决方案3】:

试试这个:

$chats = Chat::with(['messages' => function ($query) {
    $query->limit(1)->latest();
}])->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2017-12-24
    • 2023-03-10
    • 2017-10-18
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多