Laravel雄辩地说明如何通过附加数组来访问附件

时间:2014-09-22 13:38:06

标签: laravel laravel-4 eloquent

我有以下Eloquent模型:

class Song extends Eloquent {

protected $table = 'mg_songs';
protected $hidden = array('events');
protected $appends = array('lastDate');

public function events()
{
    return $this->belongsToMany('Event', 'song_event');
}

public function getLastDateAttribute()
{
    if (!$this->events) return null;

    return $this->events[0]->date->formatLocalized('%d.%m.%Y (%a, %Hч)');
}}

是否可以按“lastdate”字段排序,与db字段相同:

$songs->orderBy('title', 'asc'); - works
$songs->orderBy('lastDate', 'desc'); - doesn't works

可能存在简单的答案吗?

编辑:

我的数据库结构(只需要字段),多对多:

事件表
EVENT_ID
日期

歌曲表
song_id
标题

song_event数据透视表
ID
song_id
EVENT_ID

SQL请求:

SELECT s.title, (SELECT MAX(e.date) FROM events e JOIN song_event se ON (e.id = se.event_id) WHERE se.song_id = s.id) AS s_date FROM mg_songs s ORDER BY s_date desc

1 个答案:

答案 0 :(得分:15)

您可以按访问者对结果集合进行排序,显然无法对该查询进行排序,因为它不在数据库中。

$songs = Song::all(); // get the result
$songs->sortByDesc('lastDate'); // sort using collection method

// or ascending:
$songs->sortBy('lastDate');

如果您希望在db调用中执行此操作,则可以使用joins实现相同功能(在性能方面更好)。


另一件事:你使用if( ! $this->events)会很快造成麻烦。

检查出来:

// hasOne / belongsTo / morphTo etc - single relations
$model->relation; // returns related model OR null -> evaluates to false

// BUT for hasMany / belongsToMany etc - multiple results
$model->relation; // always returns a collection, even if empty, evaluates to true

因此请将此if更改为:

public function getLastDateAttribute()
{
    if ( ! count($this->events)) return null;

    return $this->events[0]->date->formatLocalized('%d.%m.%Y (%a, %Hч)');
}}