问题
In my Laravel project, I have different user types that all have a base User model. Here's a brief idea of the database topology:
users:
- id
- name
- email
students:
- age
- user_id
teachers:
- budget
- user_id
employee:
- is_admin
- user_id
In my case, each of Student, Teacher, Employee has their own User. But if I want to make a new Student for example, I have to make both a Student and User model. I'm aware of the Observers pattern in Laravel which can make this job easier, but I'd like to be able to programatically make Student models like the following:
$student = App\Student::create(['name' => 'Joe', 'email' => 'joe@example.net', 'age' => '20']);
The problem gets even more complex from there, because Teacher models are also required to have both an Employee model and a User model. Is there a way to override the create method on my model so that I can pass in User creation parameters, but also Student parameters?
回答1:
You can override the create method and do this yourself. In your Student model class add this:
public static function create($arr) {
$user = User::create([
'name' => $arr['name'],
'email' => $arr['email']
]);
$student = parent::create([
'age' => $arr['age']
'user_id' => $user->id
]);
return $student;
}
You can do other methods in a similar way.
If you Laravel version is above 5.4.* do this instead:
public static function create($arr) {
$user = User::create([
'name' => $arr['name'],
'email' => $arr['email']
]);
$student = static::query()->create([
'age' => $arr['age']
'user_id' => $user->id
]);
return $student;
}
来源:https://stackoverflow.com/questions/61070392/laravel-model-creation-override