如何创建具有关系的Eloquent模型?
我有:
人员表
id
firstname
lastname
员工表
id
person_id
position
我想做这样的事情:
Employee::create([
'firstname' => 'Jack',
'lastname' => 'London',
'position' => 'writer'
])
我知道,这可以创建两个模型,然后关联他们的。但可能有一种方法可以做到这一点更漂亮吗?
答案 0 :(得分:6)
首先,您必须在Person模型中创建关系
class Person extends Model
{
protected $fillable = ['firstname', 'lastname'];
public function employee()
{
return $this->hasOne('App\Employee');
}
}
在控制器中执行此操作后,您可以执行以下操作:
$person = Person::create($personData);
$person->employee()->create($employeeData);
如@Alexey Mezenin所述,您可以使用:
$person = Person::create(request()->all());
$person->employee()->create(request()->all());
反过来也是:
class Employee extends Model
{
protected $fillable = ['position'];
public function person()
{
return $this->belongsTo('App\Person');
}
}
答案 1 :(得分:3)
您仍然需要先创建人员,所以如果您正在寻找可读和合理的解决方案,您可以这样做:
$data = [
'firstname' => 'Jack',
'lastname' => 'London',
'position' => 'writer'
];
$person = Person::create($data);
$person->employee()->create($data);
答案 2 :(得分:0)
我建议您创建一个静态方法来创建实例和相关模型。很多时候,您不仅要创建模型,还可能需要用一些其他数据填充模型,并且最好使用单个createModel()
方法。
就我而言:
public static function createCompany($data) : Company {
$company = new Company($data);
$company->save();
$company->settings()->create();
// TODO Configure settings according to $data
$company->blog()->create();
// TODO: Create demo blog post
// TODO: Create default admin user.
// TODO: Etc.
}
所有这些细节都可以从控制器中抽象出来,我只在其中调用:
$company = Company::createCompany($request->all());