2016-02-23 5 views
2

У меня есть база данных, работающая на mysql 5.7.11 и имеющая много данных в таблице с колонкой JSON. Я получил сырой запрос, подобный этому.Laravel mysql json data selection

select * from `note` 
where `note_structure_id` = 3 
and JSON_EXTRACT(LCASE(data), '$._letter') = 'a' 
and JSON_EXTRACT(data, '$._number') = 1 

Выполнение продолжения pro или phpmyadmin дает мне результат, которого я ожидаю;

{"_letter": "A", "_number": 1} 

Тот же запрос, который я строю с помощью laravel, дает мне результат ничего. Пустой массив. Мой код для создания одного и того же запроса получил такой код.

$result = \DB::table('note')->where('note_structure_id', $structureId); 

if(is_array($query)) { 
    if(isset($query['where'])) { 
     foreach($query['where'] AS $field => $value) { 
      if(is_numeric($value)) { 
       $result = $result->where(\DB::raw("JSON_EXTRACT(data, '$._{$field}')"), '=', $value); 
      } 
      else { 
       $result = $result->where(\DB::raw("JSON_EXTRACT(LCASE(data), '$._{$field}')"), '=', strtolower($value)); 
      } 
     } 
    } 
} 

dd($result->get()); 

Кто-нибудь знает, что я сделал не так с моим кодом или чем-то еще. Я пробую все, что возможно для его исправления, но без результата.

Спасибо!

+0

После изучения его приходит к выводу, что мне нужно добавить JSON_UNQUOTE() вокруг JSON_EXTRACT(), и он работает как шарм! –

ответ

1

Видел, что вы его исправили, но почему бы просто не сделать как необработанный запрос более традиционным способом. В настоящий момент ваш код не читается.

$results = DB::select('select * from `note` where `note_structure_id` = :id and JSON_EXTRACT(LCASE(data), `$._letter`) = :a and JSON_EXTRACT(data, `$._number`) = :number', ['id' => 3, 'a' => 'a', 'number' => 1]);