Php 如何从多个对象构建流/提要?
我想在应用程序的首页上构建一个通知流。现在,我有新闻、会议和演示的模型。我想将这些元素组合成一个对象,可能称为事件,这样我就可以将最近的5个事件显示在首页上。输出类似于:Php 如何从多个对象构建流/提要?,php,laravel,laravel-5,Php,Laravel,Laravel 5,我想在应用程序的首页上构建一个通知流。现在,我有新闻、会议和演示的模型。我想将这些元素组合成一个对象,可能称为事件,这样我就可以将最近的5个事件显示在首页上。输出类似于: News Article: Submissions open starting April 1 Presentatiion: How to do stuff, the PDF Meeting: April 15, Foo High School Gymnasium 这些对象都实现了一个需要getTitle、getBody和g
News Article: Submissions open starting April 1
Presentatiion: How to do stuff, the PDF
Meeting: April 15, Foo High School Gymnasium
这些对象都实现了一个需要getTitle、getBody和getCreationDate的接口,因此每个对象都可以使用这些函数
我不想简单地合并这些集合,因为这会变得很混乱。有没有办法将这些对象组合成一个对象 似乎是继承的经典案例。您可以创建一个名为Event的模型
class Event extends Model
那么您提到的类将扩展事件
class Article extends Event
class Presentation extends Event
class Meeting extends Event
然后您可以在事件类上创建一个自定义方法。我认为,如果您希望避免合并集合,那么在您的情况下,编写简单的SQL要比使用Eloquent更简单
public function getUpcomingEvents()
{
// something like that, you get the idea
return DB::select('
(SELECT title, body, CreationDate FROM articles LIMIT 5)
UNION
(SELECT title, body, CreationDate FROM meetings LIMIT 5)
ORDER BY CreationDate DESC LIMIT 5')->get();
}
这将使您的控制器干净美观,模型结构将代表底层逻辑。我将反对@Tadas所说的,并说雄辩可能仍然是这里的最佳选择,使用。通过这种方式,所有事件都可以放在一个表中,很容易选择,然后您的模型可以保存您需要的任何特殊信息 将您的表格设置为如下所示:
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');
}
}
此方法在以下几个方面帮助您:
News:whereHas('events', function($query) {
$query->where('event_date', '=>', new DateTime('today'))->orderBy('event_date', 'asc')->take(5);
})->get();
事件模型可以保存所有的通用信息。当您需要来自事件对象的特定于模型的信息时,只需调用$event->eventable->