Php 如何从多个对象构建流/提要?

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

我想在应用程序的首页上构建一个通知流。现在,我有新闻、会议和演示的模型。我想将这些元素组合成一个对象,可能称为事件,这样我就可以将最近的5个事件显示在首页上。输出类似于:

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');
    }
}
此方法在以下几个方面帮助您:

  • 获得活动真的很容易。想要接下来的5项活动吗<代码>事件::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->eventable->

  • 不需要原始查询。只要继续使用正常的Laravel语法即可