自定义 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'
- 首先是 "date == today"
的所有餐厅
- 然后 "date != today"
的所有餐厅
有人可以帮帮我吗?谢谢!
这样的方法可能有用...我们的想法是添加一个额外的 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)
我的问题是关于自定义查询生成器的 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'- 首先是 "date == today" 的所有餐厅
- 然后 "date != today" 的所有餐厅
有人可以帮帮我吗?谢谢!
这样的方法可能有用...我们的想法是添加一个额外的 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)