Laravel по-русски

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

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

#1 08.12.2016 17:29:29

respectpick
Откуда: Москва
Сообщений: 83

Замена Exception обычным alert`ом

идет запрос в базу через ajax

            $new_symbol = DB::table('photo')
                ->where('photo_symbol_id', $symbol_id)
                ->where('photo_sex_id', $array_properties['sex'])
                ->whereNotIn('photo_id', array($photo_id))
                ->orderByRaw('RAND()')
                ->take(1)
                ->get(['photo_id', 'photo_src', 'photo_symbol_id']);

и если он возвращает пустой результат, то ловлю исключение

ErrorException in CompgenReplace.php line 24:
Undefined offset: 0

как сделать так, что бы вместо исключения просто выдать alert("Символ не найден!")

Не в сети

#2 08.12.2016 18:50:30

Re: Замена Exception обычным alert`ом

Ну в методе PHP-шном поставить корректный возврат в случае, если результат - пустой. Как-то так:

if (!$new_symbol) {
    return 'Запись не найдена';
}

Или я не так что-то понял?

Не в сети

#3 08.12.2016 20:02:05

Re: Замена Exception обычным alert`ом

if (!$new_symbol) {
    throw new \Exception('Запись не найдена');
}

$.ajax({
  error: function (answer) {
     alert('символ не найден');
  }
});

Изменено covobo (08.12.2016 20:02:17)

Не в сети

#4 09.12.2016 08:22:21

Re: Замена Exception обычным alert`ом

Это более кошерно smile

Не в сети

#5 09.12.2016 15:35:14

respectpick
Откуда: Москва
Сообщений: 83

Re: Замена Exception обычным alert`ом

а как сделать следующее, допустим у меня есть еще некоторые параметры, которые могут быть равны нулю или их ID в базе. Если они не равны нулю, то добавить их в условие where

            if($array_properties['sex'] == 0)
                $sex = '';
            else
                $sex = $array_properties['sex'];

            $photo_id = (int)$arr_img['photo_id'];
            try{
                $new_symbol = DB::table('photo')
                    ->where('photo_symbol_id', $symbol_id)
                    ->where('photo_sex_id', $sex)
                    ->whereNotIn('photo_id', array($photo_id))
                    ->orderByRaw('RAND()')
                    ->take(1)
                    ->get(['photo_id', 'photo_src', 'photo_symbol_id']);

так не срабатывает

Изменено respectpick (09.12.2016 15:35:38)

Не в сети

#6 09.12.2016 15:57:05

Re: Замена Exception обычным alert`ом

Не совсем понятно... Условие where, оно в любом случае отработает, зачем из него что-то исключать таким остроумным способом?... Уж если это делать, так в самом условии. Это во-первых.
Во-вторых, Ваш код написан таким образом, что 'sex', при любом значении, попадает в условие.
Посмотрите, if у Вас где заканчивается? То-то.

Не в сети

#7 09.12.2016 16:12:20

respectpick
Откуда: Москва
Сообщений: 83

Re: Замена Exception обычным alert`ом

Androbim пишет:

Не совсем понятно... Условие where, оно в любом случае отработает, зачем из него что-то исключать таким остроумным способом?... Уж если это делать, так в самом условии. Это во-первых.
Во-вторых, Ваш код написан таким образом, что 'sex', при любом значении, попадает в условие.
Посмотрите, if у Вас где заканчивается? То-то.

ну да, т.е. как бы нужно если есть $sex, то добавлять его во where, если нет, то не добавлять

просто не хочется писать что-то типа такого

if($array_properties['sex'] == 0){
                $new_symbol = DB::table('photo')
                    ->where('photo_symbol_id', $symbol_id)
                    ->whereNotIn('photo_id', array($photo_id))
                    ->orderByRaw('RAND()')
                    ->take(1)
                    ->get(['photo_id', 'photo_src', 'photo_symbol_id']);
}else{
                $new_symbol = DB::table('photo')
                    ->where('photo_symbol_id', $symbol_id)
                    ->where('photo_sex_id', $array_properties['sex']
                    ->whereNotIn('photo_id', array($photo_id))
                    ->orderByRaw('RAND()')
                    ->take(1)
                    ->get(['photo_id', 'photo_src', 'photo_symbol_id']);
}

а помимо указания sex есть еще куча других свойств, нужно при их наличии добавлять к where

Изменено respectpick (09.12.2016 16:15:05)

Не в сети

#8 09.12.2016 16:22:31

Re: Замена Exception обычным alert`ом

Я еще раз повторю, что нет необходимости предварительно отбирать значения для where. На этот случай в SQL существует "AND". Вы и здесь это применяете, неявно, например:

>where('photo_symbol_id', $symbol_id)
->where('photo_sex_id', $array_properties['sex']
->whereNotIn('photo_id', array($photo_id))

Ну и допишите к этому набору еще одно where, где sex не равно 0. И другие можно также записать.

Или у Вас формируется запрос, исходя из условий? Вы что, параметрический поиск пишете?

Изменено Androbim (09.12.2016 16:29:22)

Не в сети

#9 09.12.2016 17:26:11

respectpick
Откуда: Москва
Сообщений: 83

Re: Замена Exception обычным alert`ом

если выполнится

->where('photo_sex_id', $array_properties['sex']

когда там 0, то mysql вернет пустой результат, а мне нужно что бы если там 0, то это where вообще не рассматривалось, даже не участвовало в запросе

Не в сети

#10 09.12.2016 17:29:45

Re: Замена Exception обычным alert`ом

Ну, я понял. Таки поиск? smile

Скажу так. Когда-то сам делал, примерно так, как Вы тут написали, но, кажется, использовал switch. Не элегантно, не спорю, хотя число параметров и вариантов было невелико, и система работала.  Может, есть и получше решения.

Не в сети

#11 09.12.2016 17:33:14

respectpick
Откуда: Москва
Сообщений: 83

Re: Замена Exception обычным alert`ом

Androbim пишет:

Ну, я понял. Таки поиск? smile

Скажу так. Когда-то сам делал, примерно так, как Вы тут написали, но, кажется, использовал switch. Не элегантно, не спорю, хотя число параметров и вариантов было невелико, и система работала.  Может, есть и получше решения.

слишком сложно, у меня 6 параметров. Причем придется рассматривать варианты когда есть все 6 параметров, когда их нет, когда есть 3й и 5й, а остальных нет и тд.

Не в сети

#12 09.12.2016 17:36:40

Re: Замена Exception обычным alert`ом

$queryBuilder = DB::table('photo')
    ->where('photo_symbol_id', $symbol_id)
    ->whereNotIn('photo_id', array($photo_id))
if ($array_properties['sex']) {
    $queryBuilder->where('photo_sex_id', $array_properties['sex']);                   
}
if (..some_request_params) {
    $queryBuilder->where(...);
}

$new_symbol = $queryBuilder
                    ->orderByRaw('RAND()');
                    ->take(1)
                    ->get(['photo_id', 'photo_src', 'photo_symbol_id']);

Пока копировал ваш запрос - возможно пропустил что-то.
Но смысл в том, чтобы ->get делать в конце, и добавить, по надобности, разные условия фильтрации для $queryBuilder

Изменено covobo (09.12.2016 17:38:08)

Не в сети

#13 09.12.2016 17:43:48

Re: Замена Exception обычным alert`ом

Я в сети посмотрел - есть решения, посвященные реализации поиска на Laravel. И на этом сайте тоже такая имеется, хоть и полнотекстовый.

Создание полнотекстового поиска в Laravel

Изменено Androbim (09.12.2016 17:44:30)

Не в сети

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