【问题标题】:Laravel Eloquent relationship insert/update best praticesLaravel Eloquent 关系插入/更新最佳实践
【发布时间】:2020-05-08 06:52:16
【问题描述】:

我已经对这个问题进行了很多搜索,但找不到“正确”的答案。 我正在尝试通过自动更新关系来插入/更新数据库条目(据我所知,这在一次调用中是不可能的)。

所以第一个问题:

  • 这是正确的方法吗
  • 是否可以更新人员中的相关地址(记录)->创建/保存呼叫种类..
->save([
'persondata',
'address' => [
    'zip' => 'xxxx',
    'nr' => 1
 ]
];

我的现状

数据库布局:

表:人员: 身份证|姓名

表:地址: id|zip|nr|addressable_id|addressable_type

型号:

人:

public function address()
{
    return $this->morphOne('App\Addresses', 'addressable');
}

地址:

public function addressable()
{
    return $this->morphTo();
}

控制器 人:

store()
{
    $validated = request()->validate([
        'name' => 'required',
        'address.zip' => 'required',
        'address.nr' => 'required'
    ]);
    $person = Person::create($validated);
    $address = new Addresses(request()->input('address'));
    $address->addressable()->associate($person);
    $address->save();
}
update(Person $person)
{
    $validated = request()->validate([
        'name' => 'required',
        'address.zip' => 'required',
        'address.nr' => 'required'
    ]);
    $person->update($validated);
    $person->address->update(request()->input('address'));
}

【问题讨论】:

    标签: laravel eloquent polymorphism


    【解决方案1】:
    // Person Model
    public function person()
        {
            return $this->belongsTo('App\Person');
        }
    
    // Address Model
        public function addresses()
        {
            return $this->hasMany('App\Addresses');
        }
    
    // Controller 
    // create function
     public function create()
        {
            $address = Addresse::all();
            return view('admin.post.create',compact('categories));
        }
    // store function
     public function store(Request $request)
        {
    
                $this->validate($request,[
                    'name' => 'required',
                    'addressable_id' => 'required',
                ]);
                $person             = new Person();
                $person->addressable_id  =$id;
                $person->name      = $request->name;
                $person->save();
                Toastr::success('Your Name Successfully submited','Success');
                return redirect()->back();
    
        }
    

    【讨论】:

      【解决方案2】:

      这几乎是基于意见,但我会做以下事情:

      php artisan make:request PersonRequest

      # app\Http\Request\PersonRequest.php
      <?php
      
      namespace App\Http\Requests;
      
      use Illuminate\Foundation\Http\FormRequest;
      
      class PersonRequest extends FormRequest
      {
          public function rules()
          {
              // Note I'm NOT putting zip an nr into an array.
              return [
                  'name' => 'required',
                  'zip' => 'required',
                  'nr' => 'required'
              ];
          }
      }
      
      public function store(PersonRequest $request)
      {
          $person = Person::create($request->validated());
          $person->address()->create($request->validated());
      }
      
      public function update(PersonRequest $request, Person $person)
      {
          $person->update($request->validated());
          $person->address()->update($request->validated());
      }
      

      你会注意到我只是在重复使用validated。那是因为我依赖于模型的可填充属性,并让那些删除了我不需要的已验证请求的部分。

      # Assuming Person's fillable attributes are only 'name'
      Person::create(['name' => 'name', 'zip' => 'zip', 'nr' => 'nr'])
      # Is the same as Person::create(['name' => 'name']);
      

      此解决方案最适合不共享属性名称的模型。

      【讨论】:

      • 嗨,我同意这是基于意见的。老实说,我更好奇是否可以让 person 模型处理地址的保存/更新。 (默认情况下 laravel 处理)。我看过“->push”方法,但我不确定这是否适用于多态关系
      • 我的意思是,您可以在 Person 模型中创建一个方法,但请记住,这最终将始终转换为两个查询。我更喜欢让关系类来处理它。 (在这种情况下,MorphOne 类最终会推迟到相关的模型类Address)。没有神奇的方法可以通过 1 个 sql 查询将值插入到两个表中。至少我不知道。
      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多