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(创建/保存通话种类)中更新相关地址(记录)
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();
}