不知道大家有没有遇到我的问题?先看下如下代码:
use Encore\Admin\Widgets\Table;
$grid->column('title', '标题')->expand(function ($model) {
$comments = $model->comments()->take(10)->map(function ($comment) {
return $comment->only(['id', 'content', 'created_at']);
});
return new Table(['ID', '内容', '发布时间'], $comments->toArray());
});
很明显这就是laravel-admin的文档里边的代码。作用是展开列功能:如果一行的字段比较多,可以通过列展开功能,来隐藏过多的内容。通过点击列来展开显示,或者点击展开相关的其它数据,用来展开一条文章下的10条最新评论。
当我把代码复制过来的时候提示没有map方法。
Call to undefined method Illuminate\Database\Query\Builder::map()
于是我把$model打印了出来
App\Models\Poststest Object
可以看到这个model就是目前我这个表的模型。
然后我单独打印了$model->commentstest()
Allowed memory size of 134217728 bytes exhausted (tried to allocate 65015808 bytes)
嗯哼??逻辑死了???
后来我又从新回到了官方文档:关联模型的使用:
$comments = App\Post::find(1)->comments;
这是官方的示例语句。其中我们看到有一个find方法,包括comments的小括号是没有的。当我把这个拿过来后可以获取集合并且map方法是可以用了。
但是~!在laravel-admin中,这里是没有传id的,也就是find方法中的参数。。
我再次打印了$model 发现了这几处让我茅塞顿开。。。
看到这里边的内容只有id 1 的 ,是不是很巧合。。。正是我想要的当前数据。
最后:
所以只需要把laravel-admin
$comments = $model->comments()->take(10)->map(function ($comment) {
return $comment->only(['id', 'content', 'created_at']);
});
改为
$comments = $model->commentstest->map(function ($comment){
return $comment->only(['id', 'content', 'created_at']);
});