Laravel雄辩的关系插入/更新最佳实践

Laravel雄辩的关系插入/更新最佳实践,laravel,eloquent,polymorphism,Laravel,Eloquent,Polymorphism,关于这个问题,我搜索了很多,但很难找到“正确”的答案。 我正在尝试插入/更新一个数据库条目,并自动更新关系(据我所知,这在一次调用中是不可能的) 因此,第一个问题是: 这是正确的方法吗 是否可以在persons->create/save call kind a(创建/保存通话种类)中更新相关地址(记录) 我的现状 数据库布局: 表:人员: id |名称 表:地址: id | zip | nr |可寻址| id |可寻址|类型 型号: 人: public function address()

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

因此,第一个问题是:

  • 这是正确的方法吗
  • 是否可以在persons->create/save call kind a(创建/保存通话种类)中更新相关地址(记录)
我的现状 数据库布局:

表:人员: id |名称

表:地址: id | zip | nr |可寻址| id |可寻址|类型

型号:

人:

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

public function addressable()
{
    return $this->morphTo();
}
控制器 人:


这几乎是基于观点的,但我会做以下几点:

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'
        ];
    }
}
你会注意到我只是在重复使用
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 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();

    }
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'
        ];
    }
}
你会注意到我只是在重复使用
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”方法,但是我不确定它是否适用于polymorh关系。我的意思是,你可以在
Person
模型中创建一个方法,但请记住,这个方法最终总是会转换为两个查询。我更喜欢让关系类来处理它。(在本例中,是
MorphOne
类,它反过来又遵从相关的模型类
Address
)。没有什么神奇的方法可以通过一个sql查询将值插入到两个表中。至少我不知道。嗨,我同意这是基于意见的。。老实说,我更好奇的是,是否可以让person模型处理地址的保存/更新。(默认情况下为laravel处理)。我已经研究了“->push”方法,但是我不确定它是否适用于polymorh关系。我的意思是,你可以在
Person
模型中创建一个方法,但请记住,这个方法最终总是会转换为两个查询。我更喜欢让关系类来处理它。(在本例中,是
MorphOne
类,它反过来又遵从相关的模型类
Address
)。没有什么神奇的方法可以通过一个sql查询将值插入到两个表中。至少据我所知不是这样。
// 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();

    }