Как отсортировать глобальную область по атрибуту LARAVEL - PullRequest
0 голосов
/ 15 января 2020

Я обычно сортирую записи по столбцу, используя глобальные области действия в моей модели, но мне нужно упорядочить их по атрибуту.

protected static function boot()
{
  parent::boot();
  static::addGlobalScope('order', function (Builder $builder) {
      $builder->orderBy('MyAttribute', 'dsc');
  });
}

Ответы [ 4 ]

0 голосов
/ 16 января 2020

Вы можете сделать это тремя способами:

  • A) Вы можете применить его ко всем запросам.
  • B) Или вы можете создать одну область в вашей модели и вызовите его по запросу.
  • C) Или вы можете отсортировать его по своему запросу

A) Вы можете применить его ко всем запросам с помощью:

  1. Создайте новый файл области действия с адресом /app/Scopes/SortByScope.php

Тогда этот файл (SortByScope.ph p) должен выглядеть следующим образом:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class SortByScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        $builder->orderBy('MyAttribute', 'DESC');
    }
}
В вашей модели включите вызов в вашей голове
<?php

namespace App;

use App\Scopes\SortedOrderScope;

...rest of your model...
Включите фоллинг в вашу модель:
    /**
     * Apply to all queries.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new SortByScope);
    }

https://laravel.com/docs/master/eloquent#global -области


B) Или вы можете создать одну область в вашей модели и вызовите его по запросу:

  1. В вашей модели введите метод фоллинга:
    /**
     * Scope a query to be sorted by MyAttribute
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeSortedByMyAttribute($query)
    {
        $builder->orderBy('MyAttribute', 'DESC');
    }
Затем в вашем Запросе используйте его с:
$results = App\MyModel::sortedByMyAttribute()->get();

-или-

$results = App\MyModel::where('foo', '=', 'bar')->sortedByMyAttribute();

https://laravel.com/docs/master/eloquent#local -области


C) Или вы можете сортировать по вашему запросу, используя:

$results = App\MyModel::orderBy('MyAttribute', 'DESC')->get();
0 голосов
/ 15 января 2020

Вы имеете в виду что-то вроде

//...
->orderByRaw('(updated_at - created_at) desc')
//...
0 голосов
/ 16 января 2020

Я думаю, что ваш атрибут - аксессор, это не реальный столбец в базе данных, поэтому вы не можете получить к нему прямой доступ с помощью построителя запросов или eloquent Builder, не выходя из базы данных.

Однако вы можете получить доступ по коллекции или json. Поэтому, если вы хотите отсортировать записи, вам нужно использовать sortBy или sortByDesc для сбора. И вам нужно получить результат из базы данных. Таким образом, вы можете отсортировать их.

Model::all()->sortBy('MyAttribute');
Model::all()->sortByDesc('MyAttribute');
0 голосов
/ 15 января 2020

Вы можете использовать метод withoutGlobalScope для удаления области из вашего запроса:

Model::withoutGlobalScope('order')->orderBy('attribute', 'order')->get();

В противном случае вы можете удалить все глобальные области:

Model::withoutGlobalScopes()->orderBy('attribute', 'order')->get();

Вы можете прочитать Подробнее о Removing Global Scopes здесь: https://laravel.com/docs/6.x/eloquent

...