Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 13.02.2018 22:47:32

Почему не отрабатывается запрос с 'AND' ?

Всем доброго времени суток. Продолжаю осваивать Ларавел на примере локального сайта (стоматологическая клиника).
--------------------------------
Версия Laravel в формате 5.5.14

    Версия PHP в формате 7.1

    Операционная система и её версия ( Windows 10 x64 )

    Вендор и версия Веб-сервера в формате Apache- PHP - 7 / Nginx 1.10

----------------------------------
На сайте есть форма регистрации на прием к дантисту (ФОИ, телефон, врач, день, время, комментарий).
Реализовую невозможность записаться к конкретному врачу, если на выбранное время и в выбранный день пациент уже есть.
Для этого из таблицы в переменную $checkName хочу сохранить имя пациента (если такой есть), который записался на выбранную дату к данному врачу.  Если запрос не выбрал ни одной записи - отрабатывается dd в блоке catch. Если же переменная не пустая - отрабатывается dd в блоке try.
http://ibb.co/jCN2BS

но вылетает ошибка:
http://ibb.co/i9og5n

Дело в кавычках в имени врача, который приходит с формы.
Исполнил этот же запрос в phpmyadmin: с одинарными ' '  - все работает.
http://ibb.co/gC4Sd7

а с ` ` - опять ошибка
http://ibb.co/eYgUrS

Буду благодарен за подсказку как это поправить!)

Изменено PashaKiev (14.02.2018 11:09:08)

Не в сети

#2 14.02.2018 11:02:29

Re: Почему не отрабатывается запрос с 'AND' ?

Хотя, может не в кавычках дело.
Заменил whereColumn на простой запрос:
$checkName = Client::select('name')->where([['doctor', '=', $request->input('doctor')]])->get();
и все отработало правильно.
Не понимаю, в документации же сказано: 
"...В метод whereColumn() также можно передать массив с несколькими условиями. Эти условия будут объединены оператором AND:
PHP

$users = DB::table('users')
                ->whereColumn([
                  ['first_name', '=', 'last_name'],
                  ['updated_at', '>', 'created_at']
                ])->get();
"
Что не так с моим запросом?
$checkName = Client::select('name')->whereColumn([['doctor', '=', $request->input('doctor')],
                                                                ['day', '=', $request->input('day')],
                                                                ['time', '=', $request->input('cron')]
                                                             ])->get();

Не в сети

#3 14.02.2018 19:18:37

Re: Почему не отрабатывается запрос с 'AND' ?

Решил обойти ошибку и подсчитывать количество возвращенных строк. Этот запрос работает:

            $checkName = DB::table('clients')->select(DB::raw('count(*)'))->where([
                                                        ['doctor', '=', $request->input('doctor')],
                                                        ['day',    '=', $request->input('day')],
                                                        ['time',   '=', $request->input('cron')]
                                                        ])->get();

Но не могу понять, ПОЧЕМУ!?! следующая проверка всегда возвращает "Есть!", хотя видно что в одном случае в единственный элемент коллекции = 1, а в другом = 0.

            var_dump($checkName);
            print_r($checkName->first());

            if ($checkName->first()){
                dd("Есть!");
            }
            else{
                dd("Нет!");
            }

Что показывает браузер:

object(Illuminate\Support\Collection)#216 (1) {
  ["items":protected]=>
  array(1) {
    [0]=>
    object(stdClass)#214 (1) {
      ["count(*)"]=>
      int(0)
    }
  }
}
stdClass Object
(
    [count(*)] => 0
)

"Есть!"

------------------

object(Illuminate\Support\Collection)#216 (1) {
  ["items":protected]=>
  array(1) {
    [0]=>
    object(stdClass)#214 (1) {
      ["count(*)"]=>
      int(1)
    }
  }
}
stdClass Object
(
    [count(*)] => 1
)

"Есть!"

Не в сети

#4 14.02.2018 23:20:36

Re: Почему не отрабатывается запрос с 'AND' ?

Что не так с моим запросом?

$checkName = Client::select('name')->whereColumn([['doctor', '=', $request->input('doctor')],

Зачем здесь whereColumn? Название метода как бы и говорит: "дай мне результат, где значение в колонке А (doctor) = значению в колонке В (то, что в переменной doctor, переданной скрипту)". Поэтому к итоге в SQL получается "WHERE `doctor` = `Василий Иваныч`". Естественно, MySQL интерпретирует вторую часть как имя колонки, а не как значение. Для проверки по значению есть обычный where.

Но не могу понять, ПОЧЕМУ!?! следующая проверка всегда возвращает "Есть!", хотя видно что в одном случае в единственный элемент коллекции = 1, а в другом = 0.

На самом деле нет: в обоих случаях в коллекции ровно один элемент с именем count(*), только в первом случае у этого элемента значение 1 ("найдена одна запись"), а во втором - 0 ("записей нет"). Но ты же не спрашиваешь, какое значение у этого элемента - ты спрашиваешь, есть ли хоть один элемент (->first()) - и таки да, он есть, причем всегда. Поэтому для такого запроса ветка с dd("Нет!"); никогда не будет исполнена.

Не в сети

#5 15.02.2018 11:48:59

Re: Почему не отрабатывается запрос с 'AND' ?

и таки да, он есть, причем всегда. Поэтому для такого запроса ветка с dd("Нет!"); никогда не будет исполнена.

Proger_XP, спасибо! Написал еще в личку...

Изменено PashaKiev (15.02.2018 11:50:12)

Не в сети

#6 16.02.2018 00:38:19

Re: Почему не отрабатывается запрос с 'AND' ?

Тему пока рано закрывать((

К сожалению видно я никак не пойму каких-то азов(( :
Proger_XP, написал хорошую подсказку, но я не могу найти метод для работы с коллекциями, который просто вернет ЗНАЧЕНИЕ элемента коллекции, которое я смогу проверить в if().

Рассуждаем так:
   Моя коллекция состоит из 1 элемента (всегда 0 или 1).
   Тогда, например, посчитаем максимальное число из коллеции 1-го элемента (ну или среднее, или сумму):

$checkName->max(); // должно вернуться 1 или 0  ?????

Тогда код должен отработать:

if ($checkName->max()){
                  dd("Есть!");
              }
              else{
                  dd("Нет!");
              }

А на самом деле(((

Результат:

[{"count(name)":1}]
"Есть!"
__________________

[{"count(name)":0}]

"Есть!"

Не в сети

#7 16.02.2018 11:53:56

Re: Почему не отрабатывается запрос с 'AND' ?

Если тебе нужно получить единственный элемент, то вместо ->get() используй ->first() или ->firstOrFail() если надо выдать 404, когда ничего не найдено.

В случае ->first() ты получишь не коллекцию а саму сущность, либо null, если ничего не найдено.

Далее для проверки на пустоту коллекции есть соответствующий метод https://laravel.ru/docs/v5/collections#isempty

Чтоб понять что у тебя происходит в if ($checkName->max()) надо сделать dd($checkName)

Не в сети

#8 16.02.2018 14:58:45

Re: Почему не отрабатывается запрос с 'AND' ?

Silm, пасиб)...но я уже пробовал как ты советуешь (см. ответ от Proger_XP ).

            var_dump($checkName);
            print_r($checkName->first());

            if ($checkName->first()){
                dd("Есть!");
            }
            else{
                dd("Нет!");
            }

Повторюсь, результат, и когда вернулось 0 строк, и когда вернулась 1 строка одинаков(((( :

object(Illuminate\Support\Collection)#216 (1) {
  ["items":protected]=>
  array(1) {
    [0]=>
    object(stdClass)#214 (1) {
      ["count(*)"]=>
      int(0)
    }
  }
}
stdClass Object
(
    [count(*)] => 0
)

"Есть!"

------------------

object(Illuminate\Support\Collection)#216 (1) {
  ["items":protected]=>
  array(1) {
    [0]=>
    object(stdClass)#214 (1) {
      ["count(*)"]=>
      int(1)
    }
  }
}
stdClass Object
(
    [count(*)] => 1
)

"Есть!"

Изменено PashaKiev (16.02.2018 15:08:35)

Не в сети

Подвал раздела