Копирование данных Laravel из одного экземпляра модели в другой объект (потомок первого) - PullRequest
0 голосов
/ 02 апреля 2019

Supose this Eloquent Модель:

class User extends Model
{
    protected $table = 'users';
}

И эта:

class DeletedUser extends User
{
    public function someDeletedUserFunction()
    {
        // ... some stuff here
    }
}

Если я сделаю $user = User::find(1) и $deletedUser = new DeletedUser(), как я могу скопировать данные внутри $user объект к $deletedUser объекту?

Я пытаюсь использовать $deletedUser->attributes = $user->getAttributes, и это нормально, но я не могу сделать это с оригинальными атрибутами и данными другого внутреннего объекта.

Какможно достичь этого?

РЕДАКТИРОВАТЬ: Из-за сбивающего с толку примера, который я использовал (User и DeletedUser), я буду использовать другой пример.Предлагаю основной класс автомобилей.Я хочу создать метод Factory для поиска дочернего объекта Automobile. Это могут быть объекты AutomaticAutomobile или ManualAutomobile.Поэтому, если я вызываю Automobile::find($id), метод должен вернуть экземпляр AutomaticAutomobile или ManualAutomobile.Чего я хочу избежать, так это снова запрашивать базу данных, поэтому я запрашиваю сначала получение объекта Automobile, а затем создаю экземпляр дочернего объекта с данными объекта Automobile.Является ли этот пример более четким, чем предыдущий?

См. Этот код в качестве заводского примера:

class AutomobileFactory
{
    const MANUAL_AUTOMOBILE= 0;
    const AUTOMATIC_AUTOMOBILE= 1;

    static function create(int $rewardType, array $data)
    {
        switch($rewardType){
        case self::AUTOMATIC_AUTOMOBILE:
            return AutomaticAutomobile::create($data);
            break;
        case self::MANUAL_AUTOMOBILE:
            return ManualAutomobile::create($data);
            break;
        default:
            throw new Exception("Not supported");
        }
    }

    static function find(int $rewardType, int $id) : Reward
    {
        $automobile = Automobile::find($id);
        switch($rewardType){
        case self::AUTOMATIC_AUTOMOBILE:
            $automatic = someCopyMethods()... // Here I copy all the data
            return $automatic;
            break;
        case self::MANUAL_AUTOMOBILE:
            $manual= someCopyMethods()... // Here I copy all the data
            return $manual;
            break;
        default:
            throw new Exception("Not supported");
            return null;
        }
    }
}

1 Ответ

0 голосов
/ 02 апреля 2019

Если AutomaticAutomobile и ManualAutomobile являются дочерними элементами Automobile, почему бы вам просто не сделать это так:

 static function find(int $rewardType, int $id) : Reward
    {
        switch($rewardType){
        case self::AUTOMATIC_AUTOMOBILE:
            $automatic = AutomaticAutomobile::find($id); 
            return $automatic;
            break;
        case self::MANUAL_AUTOMOBILE:
            $manual= ManualAutomobile::find($id);
            return $manual;
            break;
        default:
            throw new Exception("Not supported");
            return null;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...