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"
}
кажется, что у вас есть данные существующие модели, так:
- во-первых, вы можете использовать этот массив для заполнения только
fillable
(илиguarded
) свойства модели. Имейте в виду, что если нетfillable
илиguarded
наTopic
модель вы получите MassAssignmentException. - затем при необходимости вручную назначьте остальные свойства.
- и
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();
надеюсь, кто-то найдет это полезным.