在一个控制器中使用2个模型是否不好

时间:2019-03-18 03:02:01

标签: php laravel

我们正在使用Laravel,并且我们有多个模型控制器。

例如:

Model1Model2以及它们对应的控制器Controller1Controller2。每次我们为Model2创建新条目时,我们都需要为Model1新建一个条目。

问题是,在Model1Model2的{​​{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();
}

2 个答案:

答案 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