定制orderBy()约束急切负载?

时间:2015-06-15 18:16:37

标签: laravel eager-loading

我的问题是关于自定义Laravel的查询构建器的orderBy()方法的可能性,我用它来排序急切加载的数据集。

这是我用来生成数据集的查询范围。到目前为止一切正常。

NODEMANAGER_MEMORY_FRACTION

我想要实现的是'restaurants.menusToday'的急切负载约束中使用的orderBy()方法的高级'asc':

  1. 首先是“date == today”
  2. 的所有餐厅
  3. 然后所有餐厅“date!= today”
  4. 有人可以帮帮我吗? THX!

2 个答案:

答案 0 :(得分:0)

这样的东西可能有用...想法是添加一个额外的选择,取决于日期是否为今天0或1。然后您可以先按该列排序,然后按实际日期排序。

public function scopeRestaurantsWithMenusToday($query, $city_uri){

    return $query->where('city_uri', '=', $city_uri)->with([
        'restaurants',
        'restaurants.menusToday' => function($query) {
            $query->addSelect(\DB::raw('if(DATE(`date`) = CURDATE(), 1, 0) as is_current_date'))->orderBy(\DB::raw('is_current_date'), 'DESC')->orderBy('date');
        }
    ]);

}

答案 1 :(得分:0)

我尝试实施类似@ user3158900的建议,直到我发现另一个问题,这使得它非常复杂,难以管理。

在这里我找到了一种新方法,只需在餐厅模型中设置一个属性,告知餐厅今天是否有菜单(= 1)或不是(= 0),然后在orderBy()方法中使用此属性。到现在为止还挺好 :)。所以我开始使用属性设置器和getter,但我不能让它工作。

这 - 作为集合集成的测试 - 工作得很好:

class Restaurant extends Model {
     protected $appends = ['menusTodayCheck' => 'thisTestWorks'];}

该集合返回一个数组" menusTodayCheck => ' thisTestWorks"在附录部分。

有没有人知道为什么这些使用$附加的方式让...()不起作用?

第1次失败)

class Restaurant extends Model {
protected $appends = ['menusTodayCheck'];

public function getMenusTodayCheckAttribute()
{
    return 'thisTestDoesntWork';
}}

该集合返回一个数组" 0 => menusTodayCheck"在附录部分。

第二次失败)

class Restaurant extends Model {
    protected $appends = ['menusTodayCheck' => function() {
    return "thisTestDoesntWork";}];}

这个甚至引发了一个错误:意外的'功能' (T_FUNCTION)