Laravel преобразование массива в модель

У меня есть массив следующим образом

      'topic' => 
  array (
    'id' => 13,
    'title' => 'Macros',
    'content' => '<p>Macros. This is the updated content.</p>
',
    'created_at' => '2014-02-28 18:36:55',
    'updated_at' => '2014-05-14 16:42:14',
    'category_id' => '5',
    'tags' => 'tags',
    'referUrl' => '',
    'user_id' => 3,
    'videoUrl' => '',
    'useDefaultVideoOverlay' => 'true',
    'positive' => 0,
    'negative' => 1,
    'context' => 'macros',
    'viewcount' => 60,
    'deleted_at' => NULL,
  )

Я хотел бы использовать этот массив и преобразовать/привести его в модель темы . Есть ли способ это сделать?

спасибо

7 ответов


попробуйте создать новый объект и передать массив в конструктор

$topic = new Topic($array['topic']);

для создания моделей из одного элемента массива:

$Topic = new Topic();
$Topic->fill($array);

для создания коллекции из массива элементы:

$Topic::hydrate($result);

вот общий способ сделать это, не уверен, есть ли метод, специфичный для Laravel, но это довольно просто реализовать.

у вас есть свой Topic класс со своими свойствами и конструктор, который создаст новый Topic объект и присвоить значения его свойств на основе массива $data передается в качестве параметра.

class Topic
{

    public $id;
    public $title;

    public function __construct(array $data = array())
    {
        foreach($data as $key => $value) {
            $this->$key = $value;
        }
    }

}

используйте его так:

$Topic = new Topic(array(
    'id' => 13,
    'title' => 'Marcos',
));

выход:

object(Topic)#1 (2) {
  ["id"]=>
  int(13)
  ["title"]=>
  string(6) "Marcos"
}

кажется, что у вас есть данные существующие модели, так:

  1. во-первых, вы можете использовать этот массив для заполнения только fillable (или guarded) свойства модели. Имейте в виду, что если нет fillable или guarded на Topic модель вы получите MassAssignmentException.
  2. затем при необходимости вручную назначьте остальные свойства.
  3. и newInstance со 2-м параметром, установленным в true чтобы красноречивый знал, что это существующая модель, а не создайте экземпляр нового объекта, так как он снова вызовет исключение при сохранении (из-за ограничений уникальных индексов, первичный ключ для начала).

.

$topic = with(new Topic)->newInstance($yourArray, true);
$topic->someProperty = $array['someProperty']; // do that for each attribute that is not fillable (or guarded)
...
$topic->save();

подводя итог, это громоздко, и, вероятно, вы вообще не должны этого делать, поэтому вопрос:почему вы хотите это сделать?


Я, скорее всего, создам новый экземпляр объекта, а затем построю его таким образом, тогда вы можете фактически разделить некоторые полезные многоразовые вещи или значения по умолчанию на модель, иначе какой смысл толкать массив в модель и ничего не делать с ней - очень мало, кроме нормализации.

Я говорю:

$topic = new Topic();
$topic->id = 3489;
$topic->name = 'Test';

и модель просто класс public $id;. Вы также можете установить значения по умолчанию, поэтому, если у вас есть свойство resync_topic или любое другое, вы можно установить его как 0 в модели, а не как 0 в массиве.


посмотрите на эти два доступных метода в L5 newInstance и newFromBuilder

Эл.г with(new static)->newInstance( $attributes , true ) ;


я наткнулся на этот вопрос ищет что-то другое. Заметил, что это немного устарело, и у меня есть другой способ справиться с проблемой OPs. Это может быть известный способ обработки создания модели из массива с более поздними версиями Laravel.

Я добавляю общий конструктор в свой класс / модель

public function __construct(array $attributes = [])
{
    parent::__construct($attributes);
}

затем, когда я хочу создать новый экземпляр модели из массива, я делаю вызов, как это

$topic = new Topic($attrs);
// Then save it if applicable
$topic->save(); // or $topic->saveOrFail();

надеюсь, кто-то найдет это полезным.