Использование построителя запросов для выбора строк, в которых присутствует значение типа $ HSTORE.
Мое заявление Где:
->where("meta_data_fields->'$type'", 'like', '%'.$query.'%')
Не уверен, что я делаю не так. Я получаю эту ошибку:
Undefined column: 7 ERROR: column "meta_data_fields->'Entity::hstore'" does not exist
Есть идеи?
чтобы получить все записи в таблице, которые имеют HSTORE
Model::where("meta_data_fields", 'like', '%'.$query.'%')->get();
Это должно делать нормально. В вашем случае данные в meta_data_fields — это строка json. если поиск выполняется по всем строкам таблицы, выберут все. Итак, вот что я сделал,
Я создал queryScope в модели
1 — получить все данные
2 — извлечь поле meta_data_ и расшифровать его
3 — цикл по полю meta_data_field
4 — выбрать только те, которые соответствуют критериям и построить массив
вот стол
+----+-------------+------------------------------------+-----------+
| id | name | desc | vendor_id |
+----+-------------+------------------------------------+-----------+
| 1 | apples | {"type":"fruit","origin":"mexico"} | 1 |
| 2 | oranges | {"type":"fruit","origin":"peru"} | 1 |
| 3 | Peaches | {"type":"fruit","origin":"mexico"} | 2 |
| 4 | Cherries | {"type":"fruit","origin":"us"} | 1 |
| 5 | banans | {"type":"fruit","origin":"brazil"} | NULL |
| 6 | Water Melon | {"type":"fruit","origin":"mexico"} | 1 |
+----+-------------+------------------------------------+-----------+
public function scopeItems($name ="mexico"){
$items = array();
$data = Self::get();
$meta_fields = json_decode($data -> pluck('desc') ,true);
foreach ($meta_fields as $key => $value) {
if (isset($value['origin']) && $value['origin'] == $name ){
$items[$key] = $data[$key] -> toArray();
}
}
return $items;
}
// output
Array
(
[0] => Array
(
[id] => 1
[name] => apples
[desc] => Array
(
[type] => fruit
[origin] => mexico
)
[vendor_id] => 1
)
[2] => Array
(
[id] => 3
[name] => Peaches
[desc] => Array
(
[type] => fruit
[origin] => mexico
)
[vendor_id] => 2
)
[5] => Array
(
[id] => 6
[name] => Water Melon
[desc] => Array
(
[type] => fruit
[origin] => mexico
)
[vendor_id] => 1
)
)
Надеюсь, на этот раз это сработает.
Вот что сработало в моей ситуации с Laravel.
$result = \DB::select(\DB::raw("SELECT hstore_fields, id from table where lower(hstore_fields->'$type') like lower('%$query%')"));