Как преобразовать объект, возвращаемый методом создания фабрики моделей laravel, в массив, содержащий поля модели?

Например, у меня есть 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)

person Kamal C. Upreti    schedule 23.01.2020    source источник


Ответы (4)


Попробуйте добавить что-то вроде этого в класс вашей модели:

public function getArr(){
        foreach($this->attributes as $key => $val){
            $array[$key] = $val;
        }
        return $array;
    }

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

person Martin    schedule 23.01.2020
comment
Спасибо за Ваш ответ. Но лучший ли это подход и эффективно ли использовать цикл? Я имею в виду, нет ли каких-либо магических методов в модели User или какой-либо вспомогательной функции laravel? - person Kamal C. Upreti; 23.01.2020
comment
Что ж, вы правы. Вы можете просто вернуть $this->attributes в функцию, которая дает тот же эффект. - person Martin; 23.01.2020
comment
Это работает? Ранее я проверял использованиеdd($user) . Возможно, я не видел свойства атрибутов. Я не мог попробовать сейчас. Я проверю это в ближайшее время. - person Kamal C. Upreti; 23.01.2020
comment
Свойство атрибутов защищено, что означает, что вы не можете получить к ним доступ вне класса, поэтому вам нужно сделать общедоступную функцию, которая может получить их для вас. - person Martin; 23.01.2020
comment
Ok. так я могу преобразовать его в массив так же, как array($user->attributes) ?? - person Kamal C. Upreti; 23.01.2020
comment
Нет. Если вы добавите вышеуказанную функцию в свой класс модели, вы можете сделать $array = $user->getArr(); - person Martin; 23.01.2020
comment
Итак, вы имеете в виду, что я могу возвращать атрибуты, используя return (array($this->attributes))? Если нет, пожалуйста, покажите его реализацию? - person Kamal C. Upreti; 23.01.2020
comment
Файл класса вашей модели User.php: <?php namespace App; ... public function getArr(){ return $this->attributes; } ?> Ваш файл, в котором вы хотите получить атрибуты модели и их значения: <?php user App\User; ... $user = User::find($user_id); $array = $user->getArr(): ?> - person Martin; 23.01.2020

Вы должны попробовать использовать необработанный метод factory вместо создания.

$user = factory(User::class)->raw();

Это должно дать вам массив, с которым вы можете работать.

person Abe Nalisi    schedule 26.06.2020

Вы можете использовать json_decode.

// Laravel 7
$userArray = json_decode(factory(User::class)->create(), true);

// Laravel 8
$userArray = json_decode(User::factory()->create(), true);
person axios    schedule 05.03.2021

Для Laravel 8 вместо метода make или create используйте:

User::factory()->raw();

Это вернет массив

person Hardik Somaiya    schedule 20.07.2021