Laravel 5.7: Когда я выкидываю $ query (Builder obj.), Он показывает только глобальную область, хотя локальная область применяется, но теперь отображается.Это намеренное поведение? - PullRequest
0 голосов
/ 28 мая 2019

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

Итак, здесь, в моем классе репозитория, я выкидываю модель.

$query = $this->model->customerWithCentralBillingChildren($customer);

dd($query);

customerWithCentralBillingChildren является локальной областью, определенной в Model.

public function scopeCustomerWithCentralBillingChildren($query, Customer $customer)
{
    $accdes = [CUT] // doesn't matter

    return $query->whereIn('accde', $accdes);
}

Существует также глобальная область, которая применяется через класс, реализующий Scope. Расположен в \App\Scopes:

class SyncActive 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('sync_active', '=', true);
    }
}

Моя проблема заключается в том, что при выводе $query в массиве отображаются только глобальные области действия.

Builder {#858 ▼
  #query: Builder {#859 ▶}
  #model: Transaction {#676 ▶}
  #eagerLoad: []
  #localMacros: []
  #onDelete: null
  #passthru: array:13 [▶]
  #scopes: array:1 [▼
    "App\Scopes\SyncActive" => SyncActive {#677} <- global scope here, but why no local one?
  ]
  #removedScopes: []
}

Тогда единственный способ увидеть, что дамп-запрос имеет также локальную область видимости, - это дамп:

dd($query->toSql());

Что дает:

"select * from `sync_transactions` where `accde` in (?, ?, ?, ?, ?, ?) and `sync_active` = ?"

тогда я вижу локальную область видимости:

where `accde` in (?, ?, ?, ?, ?, ?)

, а также глобальная область:

`sync_active` = ?

Это предполагаемое поведение? Почему дамп scopes элемент массива содержит только глобальную область видимости?

1 Ответ

2 голосов
/ 28 мая 2019

Согласно документации класса Laravel , it is clearly mentioned the scoped attribute will contains the Global Scopes`.Не упоминается о локальной области действия где-либо.глобальной области применения, применяемой автоматически с каждым запросом, поэтому он указывается с помощью атрибутов builder> для быстрой видимости.

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

Также с Global Scopes он предоставляет некоторые расширяющие функции, такие как расширение, замена, удалить, исключить и т. д. Эта функция атрибута также может помочь в отладке в таком случае.

Примечание. Это просто личная мысль, основанная на фактах, представленных в документации.Нет, где официально упоминается причина этого.Но я уверен, что это будет первоначальная мысль

Надеюсь, это поможет вам прояснить вашу проблему.

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