后端列表:在HasMany关系中按字段排序和过滤

时间:2017-01-23 15:18:29

标签: octobercms octobercms-backend

后端列表:在HasMany关系中按字段排序和筛选

我有两个与戏剧作品及其表演相关的模特:

class Play extends Model
{
 ...
public $table = 'johar_theater_plays';
public $hasMany = ['playtimes' => 'johar\Theater\Models\PlayTime'];
}

class PlayTime extends Model
{
...
public $table = 'johar_theater_plays_times';
public $belongsTo = ['play' =>  ['johar\Theater\Models\Play']];
}

我将通过关系管理器以play形式管理游戏时间。

要在playtimes列表中显示play,我发现有两种可能性:

playtimes:
    relation: playtimes
    select: time
    type: myRenderFunction

playtimes:        
    type: myRenderFunction
    sortable: true

第一种类型使用$value中的集合调用我的函数,第二种类型使用JSON字符串调用。

在第二种类型中,我可以按游戏时间排序 - 它可能只是对JSON字符串进行排序,但这没关系。

但是我发现无法创建过滤器范围来过滤掉今天之后没有任何性能的所有播放。 我试过了

scope:
  condition: playtimes.time > now()

和imho所有可能的变化。除了创建一个范围函数,我修改了不同的where子句。 问题始终是SQL将JOIN放入group_concat:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'time' in 'where clause' 
(SQL: select `johar_theater_plays`.*, 
    (select group_concat(time separator ', ') 
    from `johar_theater_plays_times` 
    where `johar_theater_plays_times`.`play_id` = `johar_theater_plays`.`id`)
    as `playtimes` 
from `johar_theater_plays` 
where `time` > 2016-12-12 00:00:00 
order by `playtimes` desc)" on line 662 of E:\..\Illuminate\Database\Connection.php

所以简短的问题是:Play HasMany Playtimes

时,如何在播放列表中按playtimes.time(或FIRST(playtimes.time))进行过滤和排序

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。如果有人有一个更美丽的东西,我会很高兴,但是现在我将使用这个范围功能:

public function scopeFutureonly($query)
{
    $table = 'johar_theater_plays_times';
    if(!$this->is_scoped) {
        $query->join($table, 'johar_theater_plays.id', '=', $table . '.play_id');
        $query->groupBy($table . '.play_id');
        $query->where($table . '.time', '>', date("Y-m-d H:i:s"));
    }
    $this->is_scoped = true;
}

isScoped是模型中的受保护变量,用于防止在多次调用范围时多次添加查询。 (感谢planetadeleste here)。

唯一的问题是,我在SQL中得到两个JOINS:一个在concat中,一个在常规中。我认为这只能通过手工完全创建SQL来规避,这会在10月份破坏10月的目的......