Значения столбца CakePHP 4 JSON находят или устанавливают псевдонимы

Итак, я заметил в документации CakePHP 4, что это не способ использовать поиск по значениям поля JSON в столбце JSON mySQL. Каждый раз, когда я пытаюсь объяснить, что я делаю, кажется, что перевод где-то теряется, поэтому я объясню, что мне нужно сделать:

Поиск записей на основе значения столбца JSON. Итак, в моей таблице у меня есть столбец json с именем Additional_info, внутри Additional_info есть несколько значений поля json, например: {1: {org_id:, имя: и т. д. Чтобы найти то, что мне нужно, мне нужно иметь возможность установить условие на основе значений поля json org_id; если я установил условие с add_info.org_id = 1, показать все записи, где 1 находится в столбце таблиц json.

Я застрял на этом несколько дней и не нашел хорошего способа сделать это. Я запутался с beforeFind в модели, поведении, чертах и ​​коллекциях. Я считаю, что моя проблема решена с помощью одного из методов, с которыми я возился, но если бы не какие-либо примеры, я бы очень признателен!

Если возможно, я бы хотел, чтобы это было установлено в модели таблицы, чтобы сделать изменение глобальным (меня это не касается)


person TheSwindler44    schedule 27.07.2020    source источник
comment
Почему бы вам не сделать org_id обычным столбцом?   -  person Bill Karwin    schedule 28.07.2020
comment
Я изменяю таблицу, которая уже была создана и содержит тысячи записей. Этот вариант не совсем осуществим.   -  person TheSwindler44    schedule 28.07.2020
comment
Я надеюсь, что есть способ установить псевдонимы и установить для этого псевдонима конкретное значение, которое я ищу.   -  person TheSwindler44    schedule 28.07.2020
comment
какую версию mysql вы используете?   -  person Salines    schedule 28.07.2020
comment
github.com/liqueurdetoile/cakephp-orm-json   -  person waspinator    schedule 28.07.2020
comment
MySQL v.5.6.43 - @waspinator, этот плагин не поддерживается на cakephp 4, а самое последнее обновление не увенчалось успехом. Есть ли более стабильный альтернативный плагин?   -  person TheSwindler44    schedule 28.07.2020
comment
извините, я солгал. MySQL v.5.7.31. @Salines   -  person TheSwindler44    schedule 28.07.2020
comment
На данный момент кажется, что пример изменения оператора SQL в beforeFind с использованием JSON_EXTRACT() был бы лучшим способом сделать это. У кого-нибудь есть пример этого?   -  person TheSwindler44    schedule 28.07.2020


Ответы (1)


Давайте узнаем, как выбрать поле в качестве псевдонима:

https://book.cakephp.org/4/en/orm/query-builder.html#selecting-data

// Results in SELECT id AS pk, title AS aliased_title, body ...
$query = $articles->find();
$query->select(['pk' => 'id', 'aliased_title' => 'title', 'body']);

Итак, в моей таблице у меня есть столбец json с именем Additional_info, внутри Additional_info есть несколько значений поля json.

// $additional_info = {
//    1:{
//        org_id:"",
//        name:""
//    }};

На данный момент кажется, что пример изменения оператора SQL в beforeFind с использованием JSON_EXTRACT() был бы лучшим способом сделать это. У кого-нибудь есть пример этого?

// SELECT JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id)) AS org_id

$query->select(['org_id' => 'JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id))'])

Где:

// .. WHERE JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id)) = `1`

$query->where(['JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id))' => '1'])

Чтобы повторно использовать свой код, вы можете создать пользовательский поиск.

https://book.cakephp.org/4/en/orm/retrieving-data-and-resultsets.html#custom-finder-methods

в поведении

https://book.cakephp.org/4/en/orm/behaviors.html#creating-a-behavior

person Salines    schedule 29.07.2020
comment
Я использую cake4 и должен был использовать его как ->where([ 'JSON_EXTRACT(payload, "$.is_active") = true']);, потому что, если бы в противном случае использовалось ->where([JSON_EXTRACT(payload, "$.is_active") = true]), он сгенерировал бы SQL как JSON_EXTRACT(payload, "$.is_echtdorsten") '1'). - person Seb; 16.06.2021