Имя атрибутов коллекции изменений Laravel

Как бы вы изменили атрибуты коллекции?
Таким образом, в результате возвращается Коллекция моделей с измененными атрибутами, а не Коллекция массивов.

Дело в том, что я хотел бы сделать что-то вроде презентатора перевода, поэтому, когда я получаю коллекцию, я мог бы dd($ collection) и вместо «name» отображалось бы «nome», также используя response () -> json ( $ collection) покажет измененный named.

что-то вроде $presenterNames = ['name' => 'nome', 'id' => 'identificador']; и имена, которых здесь нет, звонили бы нормально.

Collection {#213 ▼
    #items: array:2 [▼
        0 => Category {#215 ▼
            +timestamps: false
            #fillable: array:2 [▶]
            #connection: "mysql"
            #table: "categories"
            #primaryKey: "id"
            #keyType: "int"
            +incrementing: true
            #with: []
            #withCount: []
            #perPage: 15
            +exists: true
            +wasRecentlyCreated: false
            #attributes: array:3 [▼
            "id" => 1
            "name" => "categoria1"
            "slug" => "categoria1"
            ]
            #original: array:3 [▶]
            #changes: []
            #casts: []
            #dates: []
            #dateFormat: null
            #appends: []
            #dispatchesEvents: []
            #observables: []
            #relations: []
            #touches: []
            #hidden: []
            #visible: []
            #guarded: array:1 [▶]
            #slugOptions: null
        }
        1 => Category {#219 ▶}
    ]
}

так что в принципе я хотел бы изменить

#attributes: array:3 [▼
    "id" => 1
    "name" => "categoria1"
    "slug" => "categoria1"
]

к этому

#attributes: array:3 [▼
    "identificador" => 1
    "nome" => "categoria1"
    "slug" => "categoria1"
]

Динамически с использованием массива assoc.


person Gustavo Fenilli    schedule 25.11.2018    source источник
comment
почему вы хотите изменить это и почему бы вам не перейти с db?   -  person Niklesh Raut    schedule 25.11.2018
comment
потому что я хотел бы поддерживать базу данных, используя английские соглашения, но я хотел бы иметь возможность переводить ключ, если это необходимо, это действительно легко сделать с помощью фрактала, но фрактал предназначен только для ответов массива или json, но я хотел бы все же используйте коллекцию, если это возможно, если этот ответ не является массивом или json.   -  person Gustavo Fenilli    schedule 25.11.2018


Ответы (1)


Решение :

В вашей модели добавьте код ниже.

  protected $appends = ['nome'];

  public function getNomeAttribute(){

    return $this->attributes['name'];

 }

Вы можете получить к нему доступ, запросив $modelObj->nome;

Сделайте то же самое для всех необходимых атрибутов.

Это также отразится в вашем ответе JSON.

Спасибо

Ссылка: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor

person sadaiMudiNaadhar    schedule 25.11.2018
comment
не будет ли это плохо для производительности? вместо того, чтобы изменять непосредственно перед созданием коллекции, повторение изменения каждого из них звучит немного тяжело, и это возвращает массив, а не коллекцию обратно, поэтому я не могу использовать методы коллекции или любые другие после его отображения, поэтому я также не сможет назвать $что-›отношения-›что-то - person Gustavo Fenilli; 25.11.2018
comment
Не могли бы вы указать тип ввода и тип возврата. Вы можете изменить приведенный выше код, чтобы он возвращал массив, используя toArray(). - person sadaiMudiNaadhar; 25.11.2018
comment
в основном я просто хочу изменить атрибуты коллекции, поэтому return по-прежнему будет коллекцией, что-то вроде \App\Category:all(); возвращает коллекцию категорий, я хочу, чтобы атрибуты этой коллекции изменялись в зависимости от того, что я указал для изменения, она будет работать так же, как коллекция, которую вы получаете от all(), но просто другие имена для атрибутов. - person Gustavo Fenilli; 25.11.2018
comment
Приведенный выше код вернет коллекцию. Проверьте тип возврата. Можете ли вы уточнить свое требование, чтобы я мог предложить что-то еще. - person sadaiMudiNaadhar; 25.11.2018
comment
Collection {#220 ▼ #items: array:2 [▼ 0 =› array:3 [▼ identificador =› 1 nome =› category1 slug =› category1 ] 1 =› array:3 [▶] ] } возвращает коллекцию , но внутри него находится массив, а не набор моделей, я изменю свой вопрос, указав, что он должен поддерживать, какая это коллекция. - person Gustavo Fenilli; 25.11.2018
comment
не сейчас, я думаю, я понимаю, как бы я сделал это, используя setAttribute() из признака hasAttribute, но пока не знаю, является ли отмена старых значений хорошей вещью или достаточно изменить добавление новых значений, потому что коллекция была бы больше, если бы это было так. - person Gustavo Fenilli; 25.11.2018
comment
есть ли способ сделать этот dynamyc? это моя главная проблема, я знаю о мутаторах, но их нужно писать, и это было бы очень сложно, если бы было больше одного перевода, поэтому я подумал об использовании магического метода __set и __get. - person Gustavo Fenilli; 25.11.2018
comment
Это зависит от вашего использования. - person sadaiMudiNaadhar; 25.11.2018