Laravel фабрика с использованием пользовательского метода создания - PullRequest
0 голосов
/ 07 апреля 2020

Я переопределяю метод create на некоторых моих моделях, как в этот вопрос . Проблема, которую я обнаружил, состоит в том, что фабрики для этих моделей терпят неудачу, потому что они не вызывают мой метод create.

Код модели:

class Teacher extends Model {
  public static function create(array $attributes)
  {
    $user = User::create(['name' => $attributes['name']);
    return static::query()->create(['budget' => $attributes['budget', 'user_id' => $user->id]);
  }

Заводской код:

$factory->define(App\Teacher::class, function(Faker $faker) {
  return [
    'name' => $faker->firstName(),
    'budget' => $faker->numberBetween(100, 1000)
  ];
}

Я получаю следующую ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list' (SQL: insert into `teachers` (`name`, `budget`, `updated_at`, `created_at`) values (Audreanne, 600, 2020-04-07 16:43:54, 2020-04-07 16:43:54))

Любая помощь очень ценится!

1 Ответ

1 голос
/ 08 апреля 2020

Ответ

Фабрики не используют метод создания модели для создания модели, в которой используется метод save. Вы должны изменить свою фабрику следующим образом:

$factory->define(App\Teacher::class, function(Faker $faker) {
  return [
    'user_id' => function () {
        return factory(App\User::class)->create()->id;
    },
    'budget' => $faker->numberBetween(100, 1000)
  ];
});

У вас уже должно быть UserFactory.php, которое сгенерирует имя для связанного пользователя.

Дополнительные советы

Что касается переопределения функции создания в вашей модели, я настоятельно не рекомендую этот подход.

И где вы создаете свой teacher в коде, я бы порекомендовал использовать этот подход:

// For example in TeacherController::store
$budget = 500;
$user_id = User::create(['name' => 'Peter Griffin'])->id;
$teacher = Teacher::create(compact('budget', 'user_id'));

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

class Teacher extends Model {
    public static function createWithUser($name, $budget): Teacher
    {
        $user_id = User::create(compact('name'))->id;
        return Teacher::create(compact('budget', 'user_id'));          
    }
}

// For example
$teacher = Teacher::createWithUser('Peter Griffin', 500);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...