Я получил базу данных, работающую на MySQL 5.7.11, и содержит много данных в таблицу со столбцом JSON. Я получил сырой запрос, как этот.
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());
Кто-нибудь знает, что я сделал не так с моим кодом или что-то. Я стараюсь все, что можно исправить, но безрезультатно.
Спасибо!
Увидел, что вы это исправили, но почему бы не сделать простой запрос более традиционным способом. Ваш код не очень читаемый в данный момент.
$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]);
Других решений пока нет …