Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем доброго времени суток. Продолжаю осваивать Ларавел на примере локального сайта (стоматологическая клиника).
--------------------------------
Версия 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)
Не в сети
Хотя, может не в кавычках дело.
Заменил 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();
Не в сети
Решил обойти ошибку и подсчитывать количество возвращенных строк. Этот запрос работает:
$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
)
"Есть!"
Не в сети
Что не так с моим запросом?
$checkName = Client::select('name')->whereColumn([['doctor', '=', $request->input('doctor')],
Зачем здесь whereColumn? Название метода как бы и говорит: "дай мне результат, где значение в колонке А (doctor) = значению в колонке В (то, что в переменной doctor, переданной скрипту)". Поэтому к итоге в SQL получается "WHERE `doctor` = `Василий Иваныч`". Естественно, MySQL интерпретирует вторую часть как имя колонки, а не как значение. Для проверки по значению есть обычный where.
Но не могу понять, ПОЧЕМУ!?! следующая проверка всегда возвращает "Есть!", хотя видно что в одном случае в единственный элемент коллекции = 1, а в другом = 0.
На самом деле нет: в обоих случаях в коллекции ровно один элемент с именем count(*), только в первом случае у этого элемента значение 1 ("найдена одна запись"), а во втором - 0 ("записей нет"). Но ты же не спрашиваешь, какое значение у этого элемента - ты спрашиваешь, есть ли хоть один элемент (->first()) - и таки да, он есть, причем всегда. Поэтому для такого запроса ветка с dd("Нет!"); никогда не будет исполнена.
Не в сети
и таки да, он есть, причем всегда. Поэтому для такого запроса ветка с dd("Нет!"); никогда не будет исполнена.
Proger_XP, спасибо! Написал еще в личку...
Изменено PashaKiev (15.02.2018 11:50:12)
Не в сети
Тему пока рано закрывать((
К сожалению видно я никак не пойму каких-то азов(( :
Proger_XP, написал хорошую подсказку, но я не могу найти метод для работы с коллекциями, который просто вернет ЗНАЧЕНИЕ элемента коллекции, которое я смогу проверить в if().
Рассуждаем так:
Моя коллекция состоит из 1 элемента (всегда 0 или 1).
Тогда, например, посчитаем максимальное число из коллеции 1-го элемента (ну или среднее, или сумму):
$checkName->max(); // должно вернуться 1 или 0 ?????
Тогда код должен отработать:
if ($checkName->max()){
dd("Есть!");
}
else{
dd("Нет!");
}
А на самом деле(((
Результат:
[{"count(name)":1}]
"Есть!"
__________________
[{"count(name)":0}]
"Есть!"
Не в сети
Если тебе нужно получить единственный элемент, то вместо ->get() используй ->first() или ->firstOrFail() если надо выдать 404, когда ничего не найдено.
В случае ->first() ты получишь не коллекцию а саму сущность, либо null, если ничего не найдено.
Далее для проверки на пустоту коллекции есть соответствующий метод https://laravel.ru/docs/v5/collections#isempty
Чтоб понять что у тебя происходит в if ($checkName->max()) надо сделать dd($checkName)
Не в сети
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)
Не в сети
Страницы 1