如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?
Posted
技术标签:
【中文标题】如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?【英文标题】:How to convert object return by laravel model factory create method into array containing model fields? 【发布时间】:2020-05-09 17:31:02 【问题描述】:例如,我有一个UserFactory.php
<?php
use App\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;
$factory->define(User::class, function (Faker $faker)
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'role' => 'USER',
'password' => 'sasdcsdf34', // password
'remember_token' => Str::random(10),
];
);
现在,我可以创建如下用户
$user = factory(User::class)->create();
现在,如何在不初始化新数组和手动分配每个 $user
对象属性的情况下将此 $user
对象转换为包含用户信息(如姓名、电子邮件等)的数组。 ??
我不想像下面这样手动分配,因为如果$user
对象中有很多属性,那会很乏味
$userArray=[
'id' => $user->id,
'name' => $user->name,
'email' => $user->email
]
我已经尝试过了,但它创建了包含各种其他属性的数组,并且所需的实际值嵌套在属性中
$userArray=array($user)
【问题讨论】:
【参考方案1】:对于 Laravel 8,不要使用 make 或 create 方法,而是使用:
User::factory()->raw();
这将返回一个数组
【讨论】:
【参考方案2】:您可以使用json_decode
。
// Laravel 7
$userArray = json_decode(factory(User::class)->create(), true);
// Laravel 8
$userArray = json_decode(User::factory()->create(), true);
【讨论】:
【参考方案3】:你应该尝试使用工厂的原始方法而不是创建。
$user = factory(User::class)->raw();
这应该会给你一个可以使用的数组。
【讨论】:
【参考方案4】:尝试将这样的内容添加到您的模型类中:
public function getArr()
foreach($this->attributes as $key => $val)
$array[$key] = $val;
return $array;
如果您希望在每个模型中都有此功能,您可以使用此功能创建特征,然后将其附加到模型类或任何扩展它的类中。
【讨论】:
感谢您的回答。但这是最好的方法吗?使用循环是否有效?我的意思是User
模型或任何 laravel 的辅助函数中没有任何魔术方法吗?
嗯,你是对的。你可以在函数中返回$this->attributes
,效果相同。
这行得通吗?我之前检查过 usingdd($user)
。我可能还没有看到attributes 属性。我现在无法尝试。我会尽快检查的。
属性属性是受保护的,这意味着你不能在类之外访问它们,因此你需要创建一个可以为你获取它们的公共函数。
没有。如果您将上述功能添加到您的模型类,那么您可以做$array = $user->getArr();
以上是关于如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?的主要内容,如果未能解决你的问题,请参考以下文章