За последние 24 часа нас посетили 22219 программистов и 994 робота. Сейчас ищут 580 программистов ...

laravel json

Тема в разделе "Laravel", создана пользователем oleg_, 26 дек 2018.

  1. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    Встретился вот с такой проблемой:
    есть получаемые данные из базы, при этом некоторые поля типа json
    для примера
    запрос
    PHP:
    1. $ca=$this->un->find(3);
    ответ
    PHP:
    1.                         (
    2.                             [id] => 7
    3.                             [created_at] => 2018-12-23 20:11:04
    4.                             [updated_at] => 2018-12-23 20:11:04
    5.                             [sku] => 0180
    6.                             [color] => 750
    7.                             [images] => ["1545595852_skqvorbo.jpeg", "1545595856_wbiyn5o5.jpeg", "1545595860_6bbcmudm.jpeg"]
    8.                         )
    Как правильно преобразовать это в json (или правильно запрос делать) что бы массив остался массивом?
    json_encode и tojson
    делают вот так:
    PHP:
    1. images: "[\"1545595852_skqvorbo.jpeg\", \"1545595856_wbiyn5o5.jpeg\", \"1545595860_6bbcmudm.jpeg\"]"
    то есть все в строку преобразует
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    не очень понятно, чего хотите, но в laravel в принципе есть toArray(), попробуйте
     
  3. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    я хочу передать полученные данные в js, для этого их надо преобразовать в json, однако это затруднительно потому что в массиве присутствует вложенная json строка, когда она проходит через json_encode (а она (строка) и так уже в json) то получается не то что нужно.
    Код (Javascript):
    1. images: "[\"1545595852_skqvorbo.jpeg\", \"1545595856_wbiyn5o5.jpeg\", \"1545595860_6bbcmudm.jpeg\"]"
    toArray() тут не помогает, вложенная строка рекурсивно в массив не преобразуется, так и остается
    PHP:
    1. [images] => ["1545595852_skqvorbo.jpeg", "1545595856_wbiyn5o5.jpeg", "1545595860_6bbcmudm.jpeg"]
    это нужно в цикле перебирать весь ответ, и каждую строку делать toArray()
    в общем надо из mysql поля типа json получить ответ не в json а в нормальном виде что бы данные в массиве были одного типа
     
    #3 oleg_, 27 дек 2018
    Последнее редактирование: 27 дек 2018
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Если у тебя там Eloquent, конечно
     
  6. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    Попробовал, вещь отличная, но работает только при непосредственном обращении к полю:
    PHP:
    1. $wa=$this->variation->find(7);
    2. print_r($wa->images)
    теперь бы как ее заставить работать так:
    PHP:
    1. print_r($wa)
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    А нафига тебе, чтоб оно работало в print_r? А вот при приведении модели к json-у должно работать. Через toJson, и, по-моему, даже json_encode. Или когда просто из action модель/массив моделей возвращаешь
     
  8. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    print_r - просто смотрю что получается
    tojson ( json_encode) работает, но, эта строка и так уже json, получается вот что
    PHP:
    1. images: "[\"1545595852_skqvorbo.jpeg\", \"1545595856_wbiyn5o5.jpeg\", \"1545595860_6bbcmudm.jpeg\"]"
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Тогда перекрой в модели toArray и поправь, чтоб в этом поле был массив. Значит casting здесь не сработал. Я думал, работает.
     
  10. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    Примерчика не найдется? Чота не найду никак
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    А подумать? Я же по-русски вроде написал, перекрой метод. Или я буду программисту на Laravel объяснять, как в ООП методы родителя перекрывать?
    --- Добавлено ---
    У нас же в PHP всё в исходных кодах, посмотри, что делает toArray() у родителя, потом напиши свой, и к возврату родителя допиши всё, что душе угодно. Это же основы вообще ООП
     
  12. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    Ух там длинная история чо он там делает, боюсь кривой вилосипед сделать.
    Однако наткнулся вот на такую штуку
    https://github.com/laravel-auto-presenter/laravel-auto-presenter
    вот по русски что это
    https://habr.com/post/309942/
    как раз для подобных случаев, думаю что не придется изобретать свой велосипед.
     
    #12 oleg_, 28 дек 2018
    Последнее редактирование: 28 дек 2018
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну если нравится. Но чтоб одно поле дописать в массив - я бы не стал это всё использовать.
    --- Добавлено ---
    Код (Text):
    1.  
    2. /**
    3. * Convert the model instance to an array.
    4. *
    5. * @return array
    6. */
    7. public function toArray()
    8. {
    9.     return array_merge($this->attributesToArray(), $this->relationsToArray());
    10. }
    Ну да, совсем непонятные вещи делает :)
    Код (Text):
    1.  
    2. class MyModel extends Model {
    3.     public function toArray()
    4.     {
    5.          $arr = parent::toArray();
    6.          $arr["items"] = json_decode($arr["items"]);
    7.          return $arr;
    8.     }
    9. }
    Вот ради этого ну непременно нужно десятью декораторами обзавестись.
     
  14. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    105
    Симпатии:
    2
    Снимаю шляпу перед мастером :)
    заработало:)
    я просто не понял что тут
    PHP:
    1. return array_merge($this->attributesToArray(), $this->relationsToArray());
    за массив возвращается, а проследить по цепочке не осилил.
    и еще нюанс обнаружил:
    если прописан мутатор
    PHP:
    1.     protected $casts = [
    2.        'images' => 'array',
    3.    ];
    то достаточно вот этого что бы он работал не только при непосредственном обращении к полю
    PHP:
    1. public function toArray()
    2.     {
    3.         $arr = parent::toArray();
    4.         return $arr;
    5.     }
     
  15. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Еще есть акцесоры можно новую переменную создать + protected $appends
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Прямо такой сложный алгоритм аж в три строчки...
    Ну ты же понимаешь, что значит вообще без перекрытия можно? Твоё перекрытие вообще ничего не делает. Мне просто не попадалась ещё такая ситуация в проектах, поэтому я гадал решения. Времени на этот счёт исходник вычитывать не было.
     
  17. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510