如何用关系创建Eloquent模型?

时间:2017-01-06 16:27:05

标签: laravel laravel-5 eloquent laravel-5.2

如何创建具有关系的Eloquent模型?

我有:

人员表

id
firstname
lastname

员工表

id
person_id
position

我想做这样的事情:

Employee::create([
'firstname' => 'Jack',
'lastname' => 'London',
'position' => 'writer'
])

我知道,这可以创建两个模型,然后关联他们的。但可能有一种方法可以做到这一点更漂亮吗?

3 个答案:

答案 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());