Laravel: массив в модель с деревом отношений

Я хочу создать Eloquent Model из Array (), выбранных из базы данных, которая уже toArray() некоторые модели хранятся в базе данных. Я могу сделать это с помощью этого кода:

$model = Admin::hydrate($notification->data);

$notification->data = [
"name" => "abcd""email" => "abcd@yahoo.com""verified" => 0
"shopowner_id" => 1
"id" => 86
"shopowner" => [
"id" => 1
"name" => "Owner1""email" => "owner1@owner.com"]
];

Но я не могу получить доступ к $model->shopowner->name
Я должен использовать $model->shopowner['name']

Я хочу использовать тот же класс уведомлений без каких-либо конкретных изменений для доступа к данным.

0

Решение

Я вижу это как недопустимое использование модели ORM. Хотя вы можете изменить массив в соответствии с вашими потребностями:

$notification->data['shopowner'] = (object) $notification->data['shopowner'];
$model = Admin::hydrate($notification->data);

Ваша модель не будет работать, потому что владелец магазина будет жить как атрибут, а не как связь, поэтому, когда вы пытаетесь использовать эту модель для чего-то другого, кроме получения данных, это вызовет исключение.

1

Другие решения

Если вы хотите получить доступ shopowner как отношения, вы должны увлажнить это вручную:

$data = $notification->data;
$model = Notification::hydrate([$data])[0];
$model->setRelation('shopowner', ShopOwner::hydrate([$data['shopowner']])[0]);
1

Вы не можете получить доступ к данным массива как к объекту, вы можете переопределить атрибут и создать экземпляр объекта в вашей модели, чтобы затем использовать его таким образом. Например:

public function getShopownerAttribute($value)
{
return new Notification($value); // or whatever object here
}

class Notification {

public function __construct($data)
{
// here get the values from your array and make them as properties of the object
}
}
0

Прошло много времени с тех пор, как я использовал Laravel, но, насколько я понимаю, когда вы используете гидрат, вы получаете Illuminate\Database\Eloquent\Collection Объект, который затем содержит классы Model.

Однако они могут иметь атрибуты, которые лениво загружаются при вложении.

Использование коллекций свежий метод может помочь получить полный объект базы данных как использование нагрузка отсутствует

0

Решение:

Благодаря @Devon & @Junas. Объединив их код, я приземлился в этом решении

$data = $notification->data;
$data['shopowner'] = (object) $data['shopowner'];
$model = Admin::hydrate([$data])[0];
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector