Как я могу устранить повторяющиеся запросы (проверка и контроллер) в этом типичном случае с Laravel 5? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть два пользовательских правила в пользовательском файле запроса (ClientAsocCardRequest) для целей проверки

public function rules()
{
    return [
        'code'      => ['required', 'bail', 'size:20', new QRCodeAvailability()],
        'client'    => ['required', 'bail', 'integer', 'min:1', new CardAsocAleardy()],
    ];
}

1 QRCodeAvailability


...
public function passes ($attribute, $code) {

    $qrcod = QRcod::find($code);
...

2 CardAsocAleardy


...
public function passes ($attribute, $clientid) {

        $client = Client::find($clientid);
...

Предыдущий код генерирует два запроса к базе данных.В коде контроллера у меня есть:

...
public function asociatecard(ClientAsocCardRequest $request) {

    $qrcode = QRcod::find($request->code);
    $client = Client::find($request->client);
...

Теперь предыдущий код генерирует те же запросы в том же потоке запросов.Так что, если мне нужно проверить клиентские и qrcode eloquent объекты до, а также мне нужно работать с теми же объектами на контроллере после;как я могу уменьшить количество сгенерированных запросов.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

IMO нет другого способа сделать проверку базы данных без выполнения запроса.Если ваша цель - уменьшить количество запросов, возможно, единственный способ сделать это с помощью простого if.Кстати, Laravel уже предоставляет правило проверки для проверки, существует ли в базе данных определенная запись со значением поля.Вы можете следовать этой документации .Так что ваши правила должны выглядеть так:

return [
    'code'      => ['required', 'bail', 'size:20', 'exists:qr,id'],
    'client'    => ['required', 'bail', 'integer', 'min:1', 'exists:clients,id'],
];
0 голосов
/ 27 декабря 2018

Вот вариант:

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

public function action(Request $request) {
    $validator = $this->getValidationFactory()->make($request->all(), [
        'id' => 'required|int'
    ]);

    if(! $entity = Model::find($request->input('id'))) {
        $validator->getMessageBag()->add('id', 'Wrong id');

        throw new \Illuminate\Validation\ValidationException($validator);
    }

    // Do action on $entity.
}

Другой вариант:

Вы также можете использовать ValidationException статически.Таким образом,

1- Вы можете использовать класс Request для остальных правил проверки.(Между прочим, мне это не нравится, так как ваши правила рушатся.)

2- Или используйте $this->validate($request, ['rules']) вместо getValidationFactory() и getMessageBag().

public function action(Request $request) {
    $validator = $this->validate($request, [
        'id' => 'required|int'
    ]);

    if(! $entity = Model::find($request->input('id'))) {
        throw new \Illuminate\Validation\ValidationException::withMessages([
            'id' => ['Wrong id']
        ]);
    }

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