约束急切负载的自定义 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'];

该集合在附加部分返回一个数组“men​​usTodayCheck => '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()?的主要内容,如果未能解决你的问题,请参考以下文章

急切负载约束和 whereHas

如何为 UIView 的自定义子类设置约束?

带有标题的自定义 UITableViewCell - 约束

具有 AccessoryType 的自定义 UITableViewCell 打破了约束

关于单元重用的自定义 UITableViewCell 约束问题

webapi 实现特效路由的自定义约束 大写约束