Встретился вот с такой проблемой: есть получаемые данные из базы, при этом некоторые поля типа json для примера запрос PHP: $ca=$this->un->find(3); ответ PHP: Array ( [id] => 7 [created_at] => 2018-12-23 20:11:04 [updated_at] => 2018-12-23 20:11:04 [sku] => 0180 [color] => 750 [images] => ["1545595852_skqvorbo.jpeg", "1545595856_wbiyn5o5.jpeg", "1545595860_6bbcmudm.jpeg"] ) Как правильно преобразовать это в json (или правильно запрос делать) что бы массив остался массивом? json_encode и tojson делают вот так: PHP: images: "[\"1545595852_skqvorbo.jpeg\", \"1545595856_wbiyn5o5.jpeg\", \"1545595860_6bbcmudm.jpeg\"]" то есть все в строку преобразует
я хочу передать полученные данные в js, для этого их надо преобразовать в json, однако это затруднительно потому что в массиве присутствует вложенная json строка, когда она проходит через json_encode (а она (строка) и так уже в json) то получается не то что нужно. Код (Javascript): images: "[\"1545595852_skqvorbo.jpeg\", \"1545595856_wbiyn5o5.jpeg\", \"1545595860_6bbcmudm.jpeg\"]" toArray() тут не помогает, вложенная строка рекурсивно в массив не преобразуется, так и остается PHP: [images] => ["1545595852_skqvorbo.jpeg", "1545595856_wbiyn5o5.jpeg", "1545595860_6bbcmudm.jpeg"] это нужно в цикле перебирать весь ответ, и каждую строку делать toArray() в общем надо из mysql поля типа json получить ответ не в json а в нормальном виде что бы данные в массиве были одного типа
Попробовал, вещь отличная, но работает только при непосредственном обращении к полю: PHP: $wa=$this->variation->find(7); print_r($wa->images) теперь бы как ее заставить работать так: PHP: print_r($wa)
А нафига тебе, чтоб оно работало в print_r? А вот при приведении модели к json-у должно работать. Через toJson, и, по-моему, даже json_encode. Или когда просто из action модель/массив моделей возвращаешь
print_r - просто смотрю что получается tojson ( json_encode) работает, но, эта строка и так уже json, получается вот что PHP: images: "[\"1545595852_skqvorbo.jpeg\", \"1545595856_wbiyn5o5.jpeg\", \"1545595860_6bbcmudm.jpeg\"]"
Тогда перекрой в модели toArray и поправь, чтоб в этом поле был массив. Значит casting здесь не сработал. Я думал, работает.
А подумать? Я же по-русски вроде написал, перекрой метод. Или я буду программисту на Laravel объяснять, как в ООП методы родителя перекрывать? --- Добавлено --- У нас же в PHP всё в исходных кодах, посмотри, что делает toArray() у родителя, потом напиши свой, и к возврату родителя допиши всё, что душе угодно. Это же основы вообще ООП
Ух там длинная история чо он там делает, боюсь кривой вилосипед сделать. Однако наткнулся вот на такую штуку https://github.com/laravel-auto-presenter/laravel-auto-presenter вот по русски что это https://habr.com/post/309942/ как раз для подобных случаев, думаю что не придется изобретать свой велосипед.
Ну если нравится. Но чтоб одно поле дописать в массив - я бы не стал это всё использовать. --- Добавлено --- Код (Text): /** * Convert the model instance to an array. * * @return array */ public function toArray() { return array_merge($this->attributesToArray(), $this->relationsToArray()); } Ну да, совсем непонятные вещи делает Код (Text): class MyModel extends Model { public function toArray() { $arr = parent::toArray(); $arr["items"] = json_decode($arr["items"]); return $arr; } } Вот ради этого ну непременно нужно десятью декораторами обзавестись.
Снимаю шляпу перед мастером заработало я просто не понял что тут PHP: return array_merge($this->attributesToArray(), $this->relationsToArray()); за массив возвращается, а проследить по цепочке не осилил. и еще нюанс обнаружил: если прописан мутатор PHP: protected $casts = [ 'images' => 'array', ]; то достаточно вот этого что бы он работал не только при непосредственном обращении к полю PHP: public function toArray() { $arr = parent::toArray(); return $arr; }
Прямо такой сложный алгоритм аж в три строчки... Ну ты же понимаешь, что значит вообще без перекрытия можно? Твоё перекрытие вообще ничего не делает. Мне просто не попадалась ещё такая ситуация в проектах, поэтому я гадал решения. Времени на этот счёт исходник вычитывать не было.
Ну и ресурсы которые на самом деле полное дно в плане функционала https://laravel.com/docs/5.7/eloquent-resources