如何将 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-&gt;attributes,效果相同。 这行得通吗?我之前检查过 usingdd($user) 。我可能还没有看到attributes 属性。我现在无法尝试。我会尽快检查的。 属性属性是受保护的,这意味着你不能在类之外访问它们,因此你需要创建一个可以为你获取它们的公共函数。 没有。如果您将上述功能添加到您的模型类,那么您可以做$array = $user-&gt;getArr();

以上是关于如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 在模型工厂中定义 belongsToMany 定义

Laravel 8 基于类的模型工厂

Laravel的工厂模型关系

工厂模式

Laravel 模型工厂没有连接到数据库

是否可以向 Laravel 模型添加非持久属性?