Запросы Laravel: добавление пользовательских функций, таких как Soft Deletes - PullRequest
0 голосов
/ 15 марта 2019

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

Я предполагаю, что код будет работать аналогично программному удалению и будет включать в себя SQL-код, подобный следующему: И (isTest! = TRUE) для SQL, созданного Eloquent и Query Builder.

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

1 Ответ

0 голосов
/ 15 марта 2019

Вы ищете глобальные области, вы можете добавить настраиваемую область, которая будет проверять значение isTest.

<?php


// Your custom scope
namespace App\Scopes;

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

class IsTestScope 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->where('isTest', true);
    }
}


// Your model
namespace App;

use App\Scopes\IsTestScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        // Check for certain criteria, like environment
        if (App::environment('local')) {
            // The environment is local
            static::addGlobalScope(new IsTestScope);
        }
    }
}

Когда у вас много моделей, вы хотите создать черту этогокод, поэтому вам не нужно дублировать его все время.Например, как работают SoftDeletes.

Для получения дополнительной информации см. Документацию https://laravel.com/docs/5.8/eloquent#global-scopes

...