【问题标题】:How to create Eloquent model with relationship?如何创建具有关系的 Eloquent 模型?
【发布时间】:2017-05-21 11:08:18
【问题描述】:

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

我有:

人员表

id
firstname
lastname

员工表

id
person_id
position

我想做这样的事情:

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

我知道,可以创建两个模型然后关联它们。但是有没有办法让这更漂亮?

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.2


    【解决方案1】:

    首先,您必须在 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');
        }
    }
    

    【讨论】:

    • 您不需要分离数据源(即$request->all()),由于批量分配,它无需分离即可工作。
    • 我更新了我的问题,让它更清楚,谢谢你提到这个......
    • 酷。你也不能说“如果你正在使用质量分配”,因为create() 方法总是使用质量分配。
    • 是的,你是对的,所以我在模型中添加了 $fillable 字段
    • 如果person.employee_id 不可为空并且person 表有另一个不可为空的关系列,例如person.wallet_id,该怎么办?除了将employee_idwallet_id 添加到$fillable 并在这种情况下手动设置之外,还有其他方法吗?
    【解决方案2】:

    您仍然需要先创建人,所以如果您正在寻找可读和精简的解决方案,您可以这样做:

    $data = [
        'firstname' => 'Jack',
        'lastname' => 'London',
        'position' => 'writer'
    ];
    
    $person = Person::create($data);
    $person->employee()->create($data);
    

    【讨论】:

      【解决方案3】:

      我建议您创建一个静态方法来创建实例和相关模型。很多时候,您不仅要创建一个模型,而且还可能需要用一些额外的数据填充它,最好使用单个 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());

      【讨论】:

        猜你喜欢
        • 2018-03-01
        • 1970-01-01
        • 2021-08-22
        • 2016-04-22
        • 1970-01-01
        • 2021-10-09
        • 2014-05-19
        • 2019-09-20
        • 2017-04-05
        相关资源
        最近更新 更多