我想使用一个表单部分表示新的和现有的对象。
我发现了类似的问题:
但是我不能并且不想保存父对象。
我来自带有活动记录的rails视图。我可以做到以下几点:
我们说我有一个包含许多产品的类别:
category = Category.new
category.products << Product.new
现在我可以遍历像
这样的产品category.products.each do ...
现在我希望在laravel中使用雄辩的模型
$category = new Category();
$category->products()->....
构建器不存在 add
。
save
需要存储的类别
attach
需要相同的
有没有办法让我的想法奏效? 我的目标是使用相同的形式部分编辑和创建具有已定义关系的模型。
答案 0 :(得分:1)
您可以使用$category->products()->createMany([])
Create Many
在您拥有Category
Product
之后,您可以使用
for ($category->products as $product) {
// do something
}
或
$category->products->each(function ($product) {
// do something
});
请注意,产品之后缺少()
这将返回Collection
答案 1 :(得分:0)
Ken的回答,不符合我的特殊情况。所以我必须创建一个服务对象来处理所有依赖的情况。此服务对象存储父(我的类别)并为每个父项存储子项(我的每个类别的产品)。当所有数据都有效时,它将持久存储到数据库中。如果没有,那么save()返回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;
}
}