- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有没有一种简洁的方法可以让某些模型按默认的属性排序?它可以通过扩展 laravel 的 QueryBuilder 来工作,但要这样做,你必须重新连接它的一些核心功能 - 不好的做法。
原因
这样做的主要目的是 - 我的一个模型被许多其他人大量重用,现在你必须一遍又一遍地重新排序。即使为此使用闭包 - 你仍然必须调用它。能够应用默认排序会更好,因此使用此模型且不提供自定义排序选项的每个人都将收到按默认选项排序的记录。在这里使用存储库不是一个选项,因为它会被预先加载。
解决方案
扩展基础模型:
protected $orderBy;
protected $orderDirection = 'ASC';
public function scopeOrdered($query)
{
if ($this->orderBy)
{
return $query->orderBy($this->orderBy, $this->orderDirection);
}
return $query;
}
public function scopeGetOrdered($query)
{
return $this->scopeOrdered($query)->get();
}
在您的模型中:
protected $orderBy = 'property';
protected $orderDirection = 'DESC';
// ordering eager loaded relation
public function anotherModel()
{
return $this->belongsToMany('SomeModel', 'some_table')->ordered();
}
在您的 Controller 中:
MyModel::with('anotherModel')->getOrdered();
// or
MyModel::with('anotherModel')->ordered()->first();
最佳答案
现在我们也可以使用 Laravel 4.2 中引入的全局作用域来解决这个问题(如果我错了,请纠正我)。我们可以像这样定义一个作用域类:
<?php namespace App;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\ScopeInterface;
class OrderScope implements ScopeInterface {
private $column;
private $direction;
public function __construct($column, $direction = 'asc')
{
$this->column = $column;
$this->direction = $direction;
}
public function apply(Builder $builder, Model $model)
{
$builder->orderBy($this->column, $this->direction);
// optional macro to undo the global scope
$builder->macro('unordered', function (Builder $builder) {
$this->remove($builder, $builder->getModel());
return $builder;
});
}
public function remove(Builder $builder, Model $model)
{
$query = $builder->getQuery();
$query->orders = collect($query->orders)->reject(function ($order) {
return $order['column'] == $this->column && $order['direction'] == $this->direction;
})->values()->all();
if (count($query->orders) == 0) {
$query->orders = null;
}
}
}
然后,在您的模型中,您可以在 boot()
方法中添加范围:
protected static function boot() {
parent::boot();
static::addGlobalScope(new OrderScope('date', 'desc'));
}
现在模型是默认排序的。请注意,如果您在查询中也手动定义了顺序:MyModel::orderBy('some_column')
,那么它只会添加它作为二级排序(用于第一个排序的值相同),并且不会覆盖。为了使手动使用另一个排序成为可能,我添加了一个(可选)宏(见上文),然后你可以这样做:MyModel::unordered()->orderBy('some_column')->get()
.
Laravel 5.2 引入了一种更简洁的方式来处理全局范围。现在,我们唯一需要写的是:
<?php namespace App;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class OrderScope implements Scope
{
private $column;
private $direction;
public function __construct($column, $direction = 'asc')
{
$this->column = $column;
$this->direction = $direction;
}
public function apply(Builder $builder, Model $model)
{
$builder->orderBy($this->column, $this->direction);
}
}
然后,在您的模型中,您可以在 boot()
方法中添加范围:
protected static function boot() {
parent::boot();
static::addGlobalScope(new OrderScope('date', 'desc'));
}
要删除全局范围,只需使用:
MyModel::withoutGlobalScope(OrderScope::class)->get();
没有额外作用域类的解决方案
如果你不喜欢为作用域设置一个完整的类,你也可以(从 Laravel 5.2 开始)在你的模型的 boot()
方法中定义全局作用域:
protected static function boot() {
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('date', 'desc');
});
}
您可以使用以下命令删除此全局范围:
MyModel::withoutGlobalScope('order')->get();
关于php - Laravel 默认 orderBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20701216/
所以我尝试使用angularjs的orderby函数。目前我有一个原始数据集。 $scope.customers = [ {"name" : "Bottom-Dollar Market
我有一个包含以下数据的表列 (Varchar): COLUMN_NAME 102100 1-2000 112100 当我在 SQL 语句中使用 OrderBy 时,我按以下顺序获取项目: COLUMN
我正在研究一些 LINQ 排序,因为我有一个 ID 列表,我需要按顺序对它们进行排序。但是,某些 ID 需要优先于标准顺序。 鉴于此 C# 代码(可以粘贴到 .NET Fiddle 中进行测试),排序
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在寻找这些 LINQ 表达式的确认/澄清: var context = new SomeCustomDbContext() // LINQ to Entities? var items = co
我的数据在我的 firebase 中看起来像这样。 users: { -KOwKNCB5IiDBxY9FNzR: { content: { blah blah }, timestamp:147
在尝试找出一段代码不同步的原因后,我开始意识到 TSQL OrderBy 与 Linq OrderBy 对于字符串的差异很大。所以很自然地,我必须找到一种方法来确保来自 tsql 的语句返回与 lin
目前,如果我们将订购方向作为外部依赖项,我们必须使用 if 来应用此方向: public static IEnumerable getlist(string directory, string sea
我在我的范围内有一个对象列表,我想遍历它们,以按某些属性排序的方式显示它们的一些属性并更改它们。 ng-repeat 用于显示绑定(bind)到列表中每个对象的文本框,并应用以“position”作为
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我正在尝试以 asc 顺序显示从今天开始的特定接下来几天的约会列表。(例如:接下来的 5 天或 10 天)。仅从今天开始,接下来的 5 天或 10 天(注意:天数将是动态的,我的意思是客户将设置)。当
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: Which LINQ syntax do you prefer? Fluent or Query Expressi
我目前有一个 OData V4 服务,它具有以下模型。 “类别”——“代码” 对于每个类别,可以有许多代码。 我需要 $expand the Codes, $filter where Active =
可以说注释表具有以下结构: id | author | timestamp | body 我想使用索引有效地执行以下查询: r.table('comments').getAll("me", {inde
是否可以像这样使用 LINQ OrderBy: .OrderBy(x=>(x.SourceID == 3), (x.SourceID == 2), (x=>x.SourceID == 4), (x.S
我有一个这样的数组: $scope.telcodes = ['44', '01', '221', '335']; 如何在像这样的简单数组上使用 orderBy 来生成从 01 开始的有序列表? 我知道
我有一个像这样 Eloquent 查询: Forum::with(['comments.user'])->find($id); 这将返回嵌套结果 forum -> its comments -> us
我正在尝试通过 ManyToMany 注释自动对报告的结果进行排序 @OrderBy : /** * @ORM\ManyToMany(targetEntity="Artist", inversedB
是否有按几列对 data.frame 进行排序的标准方法,但随着减少或增加的变化?例如,您可能希望按一个变量(递减)和下一个(递增)对 data.frame 进行排序。 有没有类似的东西: mydf[
我有一个 linq 查询,无论出于何种原因,它都没有像我期望的那样返回订购。任何人都可以指出我为什么以及我做错了什么的正确方向吗? 代码如下: List designer = null; using
我是一名优秀的程序员,十分优秀!