Laravel: массив в модель с деревом отношений - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу создать 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']

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

Ответы [ 5 ]

0 голосов
/ 05 ноября 2018

Решение:

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

$data = $notification->data;                
$data['shopowner'] = (object) $data['shopowner'];
$model = Admin::hydrate([$data])[0];
0 голосов
/ 02 ноября 2018

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

$data = $notification->data;
$model = Notification::hydrate([$data])[0];
$model->setRelation('shopowner', ShopOwner::hydrate([$data['shopowner']])[0]);
0 голосов
/ 02 ноября 2018

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

Однако эти атрибуты могут иметь ленивые атрибуты при вложении.

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

0 голосов
/ 02 ноября 2018

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

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

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

0 голосов
/ 02 ноября 2018

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

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
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...