我们正在使用Laravel
,我们有多个模型控制器。
例如:
Model1
和Model2
和他们相应的控制器Controller1
和Controller2
。每次我们为Model2
创建新条目时,我们都需要为Model1
创建一个新条目。
问题是,在Model1
的Model2
和Controller1
创建新条目是不好的做法
public function store(Request $request)
{
//Create new Model1
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
//Create new Model2
$model2 = new Model2;
$model2->bla = "Model2";
$model2->save();
}
我有多个项目正在做你刚刚说过的事情,一次保存多个表上的条目。我相信这真的发生在真实场景中的应用程序上。
这是我正在做的事情:
public function store(Request $request)
{
$main = $this->saveModel1($request);
$this->saveModel2($request);
return redirect()->route('my.route.name.for.edit', $main->id);
}
private function saveModel1($request)
{
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
return $model1->id;
}
private function saveModel2($request)
{
$model2 = new Model2;
$model2->bla = "Model2";
$model2->save();
}
更新:此答案已被选为正确,但我只想在这样的条件下添加,将保存查询包含在事务中是安全的。
DB::beginTransaction();
try
{
}
catch (\PDOException $e)
{
}
这不是好习惯。一般来说,在OOP中有一个重要原则,即“单一责任原则”。根据这一点,功能或模块应该只有一个责任。 (虽然最初是'班级'应该有一个责任。)
在我看来,更好的方法是,
public function store(Request $request)
{
Model1::StoreNewData();
Model2::StoreNewData();
}
//And then in model1 and model2 implement the store function.
public static function StoreNewData()
{
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
return;
}
特别是Laravel,你应该争取'胖子模特,瘦小的控制者'。从长远来看,它会对你有所帮助。例如,突然客户端告诉您需要验证model1和/或更改数据或将新数据插入另外十个字段,然后很难更改。在现实世界中,一个表可能有20个字段,在同一个URL中它将更新5个表。调试它会很难。但现在你知道在哪里改变,你可以很容易地去特定的功能。
但最初您使用相同的功能来存储model1和model2。不应该这样做。虽然,无数教程以这种方式工作但在专业环境中单一责任原则很重要。
我通常只使用控制器功能重定向到另一个页面。如果有验证和/或某些东西,那么我会使用不同的功能或特性。
您应该在OOP中查找SOLID原理并尝试掌握它。还可以看看这个link。