自定义 orderBy() 约束急切加载?

custom orderBy() on constraining eager loads?

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

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

 public function scopeRestaurantsWithMenusToday($query, $city_uri){

    return $query->where('city_uri', '=', $city_uri)->with([
        'restaurants',
        'restaurants.menusToday' => function($query) {
            $query->orderBy('date', 'asc');
        }
    ]);

}

我想要实现的是 'restaurants.menusToday':

的急切加载约束中使用的 orderBy() 方法的高级 'asc'
  1. 首先是 "date == today"
  2. 的所有餐厅
  3. 然后 "date != today"
  4. 的所有餐厅

有人可以帮帮我吗?谢谢!

这样的方法可能有用...我们的想法是添加一个额外的 select,它是 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');
        }
    ]);

}

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

这里我发现了一个新的方法,就是在Restaurant模型中设置一个属性,告知餐厅今天有没有菜单(=1)或者没有(=0),然后在orderBy中使用这个属性( ) 方法。到目前为止,一切都很好 :)。所以我开始使用属性设置器和获取器,但我没有让它工作。

这 - 作为集合集成的测试 - 工作正常:

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

集合returns一个数组"menusTodayCheck => 'thisTestWorks"在追加部分。

有人知道为什么这些使用 $appends 和 get...() 的方法不起作用吗?

第一次失败)

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

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

集合returns 追加部分中的数组“0 => menusTodayCheck”。

第二次失败)

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

这个甚至会抛出错误:unexpected 'function' (T_FUNCTION)