Laravel:带有关系树的模型数组

时间:2018-11-02 12:37:40

标签: php laravel eloquent

我想从从数据库中获取的Array()创建一个雄辩的模型,该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 :(得分:1)

我认为这是对ORM模型的无效使用。当您可以根据需要更改数组时:

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

您的模型将不起作用,因为“店主”将作为一种属性而不是一种关系存在,因此,当您尝试将此模型用于除检索数据以外的任何其他操作时,都会导致异常。

答案 1 :(得分:1)

如果您想以关联关系访问fillna,则必须手动添加它:

df.fillna({k: df.A for k in df})

   A    B    C    D
0  3  2.0  3.0  0.0
1  5  4.0  2.0  5.0
2  7  7.0  7.0  5.0
3  9  3.0  9.0  4.0

答案 2 :(得分:0)

您不能将数组数据作为对象访问,您可以做的是重写属性并在模型中创建对象的实例,这样就可以使用它了。例如:

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
   }
}

答案 3 :(得分:0)

自从我使用laravel以来已经有一段时间了,但是据我了解,一旦您使用hydrate,就会得到一个Illuminate\Database\Eloquent\Collection对象,该对象包含模型类。

但是,这些属性可能具有嵌套时会延迟加载的属性。

使用集合fresh方法可以像使用load missing一样帮助获取完整的数据库对象

答案 4 :(得分:0)

  

解决方案:

感谢@Devon和@Junas。通过结合他们的代码,我找到了这个解决方案

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