我想在应用程序的首页上构建一个通知流。现在,我有新闻、 session 和演示的模型。我想将这些元素组合成一个对象,也许称为事件,这样我就可以获取最近的 5 个事件并将它们显示在首页上。输出将类似于:
News Article: Submissions open starting April 1
Presentatiion: How to do stuff, the PDF
Meeting: April 15, Foo High School Gymnasium
这些对象都实现了一个接口(interface),该接口(interface)需要 getTitle、getBody 和 getCreationDate,因此每个对象都可以使用这些函数。
我不想简单地合并集合,因为这会变得困惑。有什么方法可以将这些对象组合成一个对象吗?
最佳答案
我要反对 @Tadas 所说的,并说 Eloquent 可能仍然是最好的选择,使用 polymorphism 。这样,您的所有事件都可以位于一个表中,可以轻松选择,然后您的模型可以保存您需要的任何特殊信息。
将表格设置如下:
event
title
body
creation_date
eventable_id
eventable_type
news
some_other_field1
meeting
some_other_field2
还有你的模型:
class Event extends Model
{
/**
* Get all of the owning imageable models.
*/
public function eventable()
{
return $this->morphTo();
}
}
class News extends Model
{
/**
* Get all of the staff member's photos.
*/
public function events()
{
return $this->morphMany('App\Event', 'eventable');
}
}
class Meeting extends Model
{
/**
* Get all of the product's photos.
*/
public function events()
{
return $this->morphMany('App\Event', 'eventable');
}
}
此方法可以通过几种不同的方式帮助您:
- 获取事件非常简单。想要接下来的 5 场事件吗?
Event::where('event_date', '=>', new DateTime('today'))->orderBy('event_date', 'asc')->take(5);
以可重复使用的方式轻松获取不同型号即将举行的事件:
News:whereHas('events', function($query) { $query->where('event_date', '=>', new DateTime('today'))->orderBy('event_date', 'asc')->take(5); })->get();
您还可以获得继承的好处,您可以在所有模型中拥有不同的字段,但基
Event
模型可以保存您的所有通用信息。当您需要来自事件对象的特定于模型的信息时,您只需调用$event->eventable-><whatever field you need>
无需原始查询。只需继续使用正常的 Laravel 语法即可。
关于php - 如何从多个对象构建流/源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164151/