约束急切负载的自定义 orderBy()?
Posted
技术标签:
【中文标题】约束急切负载的自定义 orderBy()?【英文标题】:custom orderBy() on constraining eager loads? 【发布时间】:2015-08-31 08:42:06 【问题描述】:我的问题是关于自定义 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”的所有餐厅
有人可以帮帮我吗?谢谢!
【问题讨论】:
看看您是否甚至可以让该查询在普通 SQL 中工作。然后看看你能不能把它翻译成 Eloquent。我的第一个想法是选择今天日期的所有结果,然后将它们与非今天日期的结果合并,但可能有比这更好的方法。 也想到了,谢谢。如果没有“优雅”的 Laravel 解决方案是可能的,只是想将此作为解决方案 :) 【参考方案1】:这样的事情可能会起作用...想法是添加一个额外的选择,它是 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');
]);
【讨论】:
thx @user3158900,我尝试了另一个我现在发布的解决方案,但也失败了。如果所有这些都不起作用,我会(尝试:))使用您的 sql 语句。谢谢【参考方案2】:我尝试像@user3158900 建议的那样实现,直到我发现另一个问题,这使得它变得非常复杂且难以管理。
这里我发现了一种新方法,只需在 Restaurant 模型中设置一个属性,告知该餐厅今天是否有菜单(=1)或没有(=0),然后在 orderBy() 方法中使用此属性.到目前为止,一切都很好 :)。所以我开始使用属性设置器和获取器,但我没有得到它的工作。
这 - 作为集合集成的测试 - 工作得很好:
class Restaurant extends Model
protected $appends = ['menusTodayCheck' => 'thisTestWorks'];
该集合在附加部分返回一个数组“menusTodayCheck => 'thisTestWorks”。
有人知道为什么这些使用 $appends 和 get...() 的方法不起作用吗?
第一次失败)
class Restaurant extends Model
protected $appends = ['menusTodayCheck'];
public function getMenusTodayCheckAttribute()
return 'thisTestDoesntWork';
该集合在附加部分返回一个数组“0 => menusTodayCheck”。
第二次失败)
class Restaurant extends Model
protected $appends = ['menusTodayCheck' => function()
return "thisTestDoesntWork";];
这个甚至抛出一个错误:意外的'function'(T_FUNCTION)
【讨论】:
以上是关于约束急切负载的自定义 orderBy()?的主要内容,如果未能解决你的问题,请参考以下文章
具有 AccessoryType 的自定义 UITableViewCell 打破了约束