从与“Lazy Eager Loading”的关系中返回第一个元素 [Laravel 5.2]

Posted

技术标签:

【中文标题】从与“Lazy Eager Loading”的关系中返回第一个元素 [Laravel 5.2]【英文标题】:Return first element from relation with `Lazy Eager Loading` [Laravel 5.2] 【发布时间】:2016-10-31 05:04:38 【问题描述】:

我有这样的关系:

public function message()

   return $this->hasMany('Engine\Message');

在我的Conversation 模型中。

对于每个对话,我都需要收到最后一条消息。

这是我尝试过的,但这只会在第一次对话中收到一条消息,但不会从其他对话中收到消息...

$con = Conversation::all();

$con->load(['message' => function ($q) use ( &$mess ) 
                $mess = $q->first();
            ]);

return $con;

我不想查询每条记录...有人知道如何解决这个问题吗?

【问题讨论】:

这篇博文就是你的答案:softonsofa.com/… 添加->take(1)。它将返回一个仅包含 1 个项目的相关模型的数组/集合 【参考方案1】:

试试

$con = Conversation::all();
$con->load(['message' => function ($q) use ( &$mess ) 
                $q->orderBy('created_at', 'desc')->take(1);
                // or if you don't use timestamps
                // $q->orderBy('id', 'desc')->take(1)
            ]);
return $con;

【讨论】:

感谢您的尝试,但无法正常工作...在一次对话中它收到 1 条消息,但在其他对话中只是空白...【参考方案2】:

如建议here!

不要在预加载中使用first()get(),您应该在模型中创建一个新关系。

模型看起来像这样......

公共函数 message()

    return $this->hasOne('Engine\Message');

向“pmall”致敬

【讨论】:

以上是关于从与“Lazy Eager Loading”的关系中返回第一个元素 [Laravel 5.2]的主要内容,如果未能解决你的问题,请参考以下文章

从与 Doctrine2 的多对多关系中获取数据

Hibernate Search和复杂的关系

从与条件匹配的列表创建字典

从与服务相同的目录提供静态内容 - Dropwizard

从与 Drizzle 的合同中读取元组

Ktor 从与 ContentNegotiation 一起使用 receive() 的端点返回 415