Как временно отключить мусорный фильтр? - PullRequest
0 голосов
/ 27 сентября 2018

Скажем, у меня есть A, у которого есть B, у которого есть C, у которого есть D. Я хочу перейти от A к D, но любой (или все) из объектов, возможно, был удален.Поэтому я должен сделать это:

$d = $a->b()->withTrashed()->first()->c()->withTrashed()->first()->d()->withTrashed()->first()

Что ужасно.Я действительно предпочел бы сделать это:

turnOffTrashedFilter();
$d = $a->b->c->d;

Есть ли у laravel такая способность?

Обратите внимание, что это всего лишь пример - ситуация, которая вызвала этот вопрос, на самом деле намного сложнее,с различными вызовами, вложенными в другие вызовы, так что практически невозможно использовать withTrashed, как указано выше.Мне нужно отключить фильтр на время запроса, без необходимости изменять огромные участки кода для включения двух параллельных путей.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вместо этого вы можете использовать withTrashed () в ваших отношениях:

public function aTrashed()
{
    return $this->hasOne(A::class)->withTrashed();
}

public function bTrashed()
{
    return $this->hasMany(B::class)->withTrashed();
}

public function cTrashed()
{
    return $this->belongsToMany(C:class)->withTrashed();
}

// Then use it
$d = $z->aTrashed->bTrashed->cTrashed;
0 голосов
/ 27 сентября 2018

Нет встроенного, но это можно сделать

Нет встроенного способа отключить автоматическую фильтрацию мягкого удаления.Однако это возможно.Фильтр мягкого удаления - это глобальная область, добавленная в метод загрузки класса.Его можно удалить, например, так:

    \Event::listen('eloquent.booted:*', function($name) {
    $name = substr($name, 17); // event name is "eloquent.booted: some/class"
    $class = new \ReflectionClass($name);
    $prop = $class->getProperty('globalScopes');
    $prop->setAccessible(true);
    $scopes = $prop->getValue();
    foreach ($scopes as $c => &$s) {
        unset($s['Illuminate\Database\Eloquent\SoftDeletingScope']);
    }
    $prop->setValue($scopes);
});

Это перехватывает событие загрузки, которое запускается сразу после добавления глобальной области в класс.Затем он открывает (приватный статический) атрибут globalScopes, который представляет собой список прикрепленных глобальных областей, и удаляет программный элемент удаления.Это предотвратит присоединение области Softdelete к любым моделям, при условии, что их метод статической загрузки называется после добавляется прослушиватель событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...