Например:
{"country":"Россия","city":"Москва","street":"пр-т Мира"}
Что нужно изменить в
public function applyFilter($model, $value) { return $model->filterLike($this->name, "%{$value}%"); }
public function applyFilter($model, $value) { return $model->filterLike($this->name, "%{$value}%"); }
return $model->filterLike(JSON_EXTRACT($this->name , '$.street'), "%{$value}%");
public function applyFilter($model, $value) { return $model->filterLike($this->name, '%"street":"'.$value.'"%'); }
$my_json = '{"country":"Россия","city":"Москва","street":"пр-т Мира"}'; $my_json = json_decode($my_json,true); //Array ( [country] => Россия [city] => Москва [street] => пр-т Мира ) foreach($my_json as $key =>$val){ $adreses = $val; echo $adreses; // Россия Москва пр-т Мира }
Не сработало. JSON_EXTRACT думаю помог бы, но куда его прикрутить?
Если это всё {"country":"Россия","city":"Москва","street":"пр-т Мира"} хранится в одной ячейке в БД, то никак. В одной ячейке можно фильтровать по "Содержит", "Не содержит", либо писать свой фильтр с JSON_EXTRACT dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#function_json-extract.
Попробуйте это, хоть я и не уверен что сработает
return $model->filterLike(JSON_EXTRACT($this->name , '$.street'), "%{$value}%");
Гениев-то полно, добрых — чуть меньше, но сделать может каждый. Если вам нужен поиск чисто по "улице", то я бы в это поле сохранял значение улицы, а вот всё остальное уже закинул в денормальное поле (поле с суффиксом _cache). Хоть оно и не для это предназначено.Может найдутся добрые гении и сделают тип поля для работы с json данными, в том числе и в фильтре?
$this->filter("JSON_EXTRACT(`" . $this->name . "` , '$.street') LIKE '%" . $value . "%';");
Это тоже не работает. Включается гифка бесконечной загрузки. Но никаких ошибок нигде не выскакивает.
Гениев-то полно, добрых — чуть меньше, но сделать может каждый. Если вам нужен поиск чисто по "улице", то я бы в это поле сохранял значение улицы, а вот всё остальное уже закинул в денормальное поле (поле с суффиксом _cache). Хоть оно и не для это предназначено.
Попробуйте тогда этот фильтр
$this->filter("JSON_EXTRACT(`" . $this->name . "` , '$.street') LIKE '%" . $value . "%';");
В доках об этом сильно умалчивается, но посмотрите как сделано поле "Местоположение" github.com/instantsoft/icms2/blob/master/system/fields/city.php#L13Где можно посмотреть про "денормальное поле (поле с суффиксом _cache)" — что это такое?
$this->filter("JSON_EXTRACT(" . $this->name . ", '$.street') LIKE '%" . $value . "%';");
Создал простейшее поле с содержимым в test.php
Там идентификатор по которому работает само поле хранится в одной ячейке, а строковое значение этого поля, которое выводится на сайте — в другой ячейке. Ячеек может быть только две — основная и "ненормальная". Больше нельзя добавить в этом случае.
class fieldTest extends cmsFormField { public $title = 'TEST'; public $sql = 'varchar(500) NULL DEFAULT NULL'; public $cache_sql = 'varchar(500) NULL DEFAULT NULL'; public $filter_type = 'str'; public $var_type = 'string'; public $is_denormalization = true; public function parse($value){ return 'Cache: ' . $this->item[$this->getDenormalName()] . 'Test: ' . $this->item[$this->name]; } }
echo html_input('text', $field->name, $field->item[$field->name], ['placeholder'=>'test']); echo html_input('text', $field->getDenormalName(), $field->item[$field->getDenormalName()], ['placeholder'=>'test_cache']);