Laravel Query Builder не выполняет запрос правильно, даже если он правильно связывается - PullRequest
0 голосов
/ 24 сентября 2019

У меня проблема с Laravel Query Builder.Когда я пытаюсь связать переменную, которая будет включать в себя некоторый SQL-код, в мой параметр привязки, он не возвращает результатов.Если я запускаю enableQueryLog (), я вижу, что запрос и привязка верны.Таким образом, код обеспечивает прекрасный запрос, но, тем не менее, он не работает соответствующим образом.

Я уже пытался распечатать все важные переменные.Я включил журнал запросов, чтобы увидеть, все ли настроено правильно, и это так.Когда я вставляю переменную в мой whereRaw () так же, как и без привязки, она работает нормально.Просто не с привязкой.

Это код, который я запускаю:

public function getCarbrands() {

        $name = 'name != Ford';
        try {
            $brands = DB::table('ni_carbrands')
                ->whereRaw(':name',['name'=>$name])
                ->select('id','name')
                ->get();
            echo json_encode( array('info' => 1 ,'status' => 'Successfully found car brands', 'details' => $brands));

        } catch(Exception $e){

            echo json_encode( array('info' => 0 ,'status' => 'Error finding car brands', 'e' => $e)); 

        }

    }

Я знаю, что такое использование функции привязки не нужно, это просто тест для некоторых других функций, которые яхочу построить.Вот что возвращает мой журнал запросов:

array:1 [▼
  0 => array:3 [▼
    "query" => "select `id`, `name` from `ni_carbrands` where :name"
    "bindings" => array:1 [▼
      0 => "name != Ford"
    ]
    "time" => 190.25
  ]
]

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

Ожидаемые результаты будут примерно такимиэто:

{
    "info": 1,
    "status": "Successfully found car brands",
    "details": [
        {
            "id": 1,
            "name": "Toyota"
        },
        {
            "id": 2,
            "name": "Fiat"
        },
        {
            "id": 3,
            "name": "Iveco"
        },
        {
            "id": 4,
            "name": "Citroën"
        },
        {
            "id": 5,
            "name": "Opel"
        },
        {
            "id": 6,
            "name": "Mercedes"
        },
        {
            "id": 8,
            "name": "Volkswagen"
        },
        {
            "id": 9,
            "name": "Renault"
        },
        {
            "id": 10,
            "name": "MAN"
        },
        {
            "id": 11,
            "name": "Nissan"
        },
        {
            "id": 12,
            "name": "Hyundai"
        },
        {
            "id": 13,
            "name": "Peugeot"
        }
    ]
}

Но фактический результат:

{"info":1,"status":"Successfully found car brands","details":[]}

Я был бы очень признателен за помощь.

Ответы [ 4 ]

0 голосов
/ 25 сентября 2019
$name = 'name != Ford';
$brands = DB::table('ni_carbrands')
                ->whereRaw(':name',['name'=>$name])
                ->select('id','name')
                ->get();

это эквивалентный запрос

select from ni_carbrands where 'name != Ford'

конечно, он не работает, потому что у вас есть проблема

select from ni_carbrands where name != Ford

в кавычках

0 голосов
/ 24 сентября 2019

вы можете использовать этот вид также

$brands = DB::table('ni_carbrands')
            ->select('id','name')
            ->where('name', '!=', 'Ford')
            ->get();

, в противном случае вы можете установить, где условие в динамическом поле, как

->where($name, '!=', 'Ford')
0 голосов
/ 25 сентября 2019

Кажется, что вы не можете связать строку, содержащую оператор.
Взгляните на это Могу ли я связать параметр с оператором PDO как оператор сравнения? И этот переплет не нулевой в pdo

0 голосов
/ 24 сентября 2019

Плохое состояние: whereRaw(':name',['name'=>$name]) Так же, как это:

$brands = DB::table('ni_carbrands')
                ->select('id','name')
                ->whereRaw($name)
                ->get();
...