我们正在使用Laravel
,并且我们有多个模型控制器。
例如:
Model1
和Model2
以及它们对应的控制器Controller1
和Controller2
。每次我们为Model2
创建新条目时,我们都需要为Model1
新建一个条目。
问题是,在Model1
和Model2
的{{1}}和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();
}
答案 0 :(得分:4)
我有多个项目正在执行您刚才所说的事情,一次将条目保存到多个表中。我相信这确实是在现实世界中的应用程序上发生的。
这是我在做什么:
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)
{
}
答案 1 :(得分:0)
这不是好习惯。通常,在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。