Laravel 将关系对象添加到新的 eloquent 模型
Laravel add relation objects to new eloquent model
我想为新对象和现有对象使用部分表单。
我发现了类似的问题:
- Create new eloquent instance with relationships
但我不能也不想保存父对象。
我来自具有活动记录的 rails 视图。我可以做到以下几点:
假设我有一个包含许多产品的类别:
category = Category.new
category.products << Product.new
现在我可以像这样迭代产品
category.products.each do ...
现在我想在 laravel 中使用 eloquent 模型
$category = new Category();
$category->products()->....
add
对于生成器不存在。
save
需要存储类别
attach
需要相同的
有没有办法让我的想法付诸实施?
我的目标是使用相同的形式部分进行编辑和创建具有定义关系的模型。
您可以使用 $category->products()->createMany([])
Create Many
创建许多作品
在你有一个包含许多 Product
的 Category
之后,你可以使用
遍历它们
for ($category->products as $product) {
// do something
}
或
$category->products->each(function ($product) {
// do something
});
注意缺少 ()
后的产品,这将 return 一个 Collection
Ken 的回答,不适合我的特殊情况。所以我必须创建一个服务对象来处理所有依赖案例。此服务对象存储父项(我的类别)并为每个父项存储子项(我的每个类别的产品)。当所有数据都有效时,它将被持久化到数据库中。如果没有,那么 save() returns false 我会收到异常消息和验证错误。
所以我的服务对象包含以下内容:
namespace App\Services;
use Illuminate\Support\Facades\Validator;
class FormObject
{
protected $children = [];
protected $parent, $validator;
protected $errorMessages = [];
public function save(){
if(!$this->isValid()){
return false;
}
try{
DB::beginTransaction();
// save parent and all relations....
DB::commit();
}catch(\Exception $e){
DB::rollBack();
$this->addErrorMessage($e->getMessage());
return false;
}
return true;
}
public function isValid(){
return $this->getValidator()->passes();
}
public function add($identifier, array $collection){
$this->children[$identifier] = $collection;
}
public function addErrorMessage($message){
array_push($this->errorMessages, $message);
}
public function setParent(Model $parent){
$this->parent = $parent;
}
public function setValidator(Validator $validator){
$this->validator = $validator;
}
public function get($identifier){
return $this->children[$identifier];
}
public function getErrorMessages(){
return $this->errorMessages;
}
public function getParent(){
return $this->parent;
}
public function getValidator(){
return $this->validator;
}
}
我想为新对象和现有对象使用部分表单。
我发现了类似的问题:
- Create new eloquent instance with relationships
但我不能也不想保存父对象。
我来自具有活动记录的 rails 视图。我可以做到以下几点:
假设我有一个包含许多产品的类别:
category = Category.new
category.products << Product.new
现在我可以像这样迭代产品
category.products.each do ...
现在我想在 laravel 中使用 eloquent 模型
$category = new Category();
$category->products()->....
add
对于生成器不存在。
save
需要存储类别
attach
需要相同的
有没有办法让我的想法付诸实施? 我的目标是使用相同的形式部分进行编辑和创建具有定义关系的模型。
您可以使用 $category->products()->createMany([])
Create Many
在你有一个包含许多 Product
的 Category
之后,你可以使用
for ($category->products as $product) {
// do something
}
或
$category->products->each(function ($product) {
// do something
});
注意缺少 ()
后的产品,这将 return 一个 Collection
Ken 的回答,不适合我的特殊情况。所以我必须创建一个服务对象来处理所有依赖案例。此服务对象存储父项(我的类别)并为每个父项存储子项(我的每个类别的产品)。当所有数据都有效时,它将被持久化到数据库中。如果没有,那么 save() returns false 我会收到异常消息和验证错误。
所以我的服务对象包含以下内容:
namespace App\Services;
use Illuminate\Support\Facades\Validator;
class FormObject
{
protected $children = [];
protected $parent, $validator;
protected $errorMessages = [];
public function save(){
if(!$this->isValid()){
return false;
}
try{
DB::beginTransaction();
// save parent and all relations....
DB::commit();
}catch(\Exception $e){
DB::rollBack();
$this->addErrorMessage($e->getMessage());
return false;
}
return true;
}
public function isValid(){
return $this->getValidator()->passes();
}
public function add($identifier, array $collection){
$this->children[$identifier] = $collection;
}
public function addErrorMessage($message){
array_push($this->errorMessages, $message);
}
public function setParent(Model $parent){
$this->parent = $parent;
}
public function setValidator(Validator $validator){
$this->validator = $validator;
}
public function get($identifier){
return $this->children[$identifier];
}
public function getErrorMessages(){
return $this->errorMessages;
}
public function getParent(){
return $this->parent;
}
public function getValidator(){
return $this->validator;
}
}