我想知道最好的方法是在包含多个模型类型的刀片中循环使用Laravel集合。以我为例,我有一个包含评论和建议的集合。ConversationsController
:
$conversation->comments = $conversation->comments->merge($conversation->proposals)->sortBy('created_at');
show.blade.php
:
@foreach($conversation->comments as $collection)
@if(get_class($collection) === 'App\Models\ConversationComment')
@include('partials/comment', ['comment' => $collection])
@else
@include('partials/proposal', ['proposal' => $collection])
@endif
@endforeach
我提出的这个实现是可行的。但感觉有点怪。
那么,Laravel的方法是什么呢?
1条答案
按热度按时间6vl6ewon1#
我相信你希望它们被合并,因为你想按
created_at
排序,然后让它们在列表中混合显示。即使这看起来很脏-如果你想让它们合并在一起,这是唯一的方法。
有一些代码高尔夫选项,可用于此,但它都归结为同一件事。
你可以用一个部分
然后让这个部分在里面有这样的东西:
但我建议你尝试制作数据传输对象,它将封装所有应该为它们显示的东西,然后只使用一个单独的部分来显示它,因为我相信这两个共享相同的属性。
例如,如果你想只显示评论/建议文本+添加日期+谁留下了评论/建议,那么你可以将评论和建议合并在一起,并以统一的形式显示它们,例如:
然后在刀片服务器中,您不必检查它们的类类型,只需遍历所有项目并根据需要调用
text
,created_at
和added_by
。有关DTO的更多详细信息,您可以查看:https://medium.com/@eloufirhatim/what-is-dto-and-how-to-use-it-in-a-laravel-application-7ca1e9045985#:~:text= DTO%20stands%20for%20Data%20Transfer,different%20parts%20of%20the%20application.
你可以查看这个库:https://spatie.be/docs/laravel-data/v3/introduction