最佳实践-Laravel Controller雄辩地合并

时间:2019-10-01 21:51:17

标签: laravel eloquent controller

我在我的供应商模型上有一个范围,该范围在import numpy as np f = open("cloud.data",'r') file_object = f.read() new_file_object = file_object.center(5) print (new_file_object) m = np.matrix(file_object) eigenvalues = np.linalg.eigvals(m) eigenvectors = np.linalg.eig(m) print (eigenvalues) print (eigenvectors) 处返回结果。

这在创建新条目时非常有用,因为我只希望用户看到活跃的供应商。

当前条目的供应商可能不活跃;当我对其进行编辑时,我想查看所有活动的供应商,以及当前的供应商(如果它处于非活动状态)

我的控制器中有以下代码:

active = true

两个问题:这是执行此操作的正确方法吗?该代码应该放在我的控制器中还是应该放在其他地方? (也许是一个范围,但我不知道该如何编码)。


编辑:

感谢帮助人员。我已经根据每个答案提出了建议,并将我的代码重构到了新的范围:

        $suppliers = Supplier::active()->get();
        if (!$suppliers->contains('id', $record->supplier->id))
        {
            $suppliers->add(Supplier::find($record->supplier->id));
        }

3 个答案:

答案 0 :(得分:1)

您编写的内容可以使用,但是如果集合很大,Collection::contains函数可能会非常慢。

由于您具有ID,我可能会进行以下更改:

$suppliers = Supplier::active()->get();
$supplier = Supplier::find($record->supplier->id);
if (!$supplier->active) {
  $suppliers->add($supplier);
}

当然,这样做的缺点是您 可能 对数据库进行了不必要的查询。

所以您必须考虑:

  • record的供应商是活跃的还是不活跃的?
  • 活跃的供应商集合的大小是否足以证明对数据库的另一个(可能是浪费的)调用的合理性?

根据对应用程序数据的了解,做出最有意义的选择。


关于第二个问题,如果在应用程序的这一部分中仅需要这组特定的供应商,则控制器是编写此代码的好地方。

但是,如果在应用程序的其他部分需要特定的供应商,则应将此代码移至其他位置。在这种情况下,在相关模型上创建函数(无论类型$record是什么)都可以返回该模型的供应商集。像这样:

public function getSuppliers()
{
  $suppliers = Supplier::active()->get();
  $supplier = $this->supplier;

  if (!$supplier->active) {
    $suppliers->add($supplier);
  }

  return $suppliers;
}

答案 1 :(得分:1)

我看到@Vince关于第一个问题的回答,我同意他的看法。 关于第二个问题:

在供应商模型中写入范围,如下所示:

public function scopeActive($query){
    $query->where('active', 1); // for boolean type
}

为实现最佳实践,您需要在“ App \ Services \ SupplierService.php”之类的服务中编写逻辑部分。然后编写所需的功能:

public function activeSuppliersWithCurrent($record) {
    $suppliers = Supplier::active()->get();
    $supplier = Supplier::find($record->supplier->id);
    if (!$supplier->active) {
        $suppliers->add($supplier);
    }
}

在SupplierController的构造函数中,注入该服务的实例并使用该函数,例如:

use App\Servives\SupplierService;

protected $supplierService = null;

public function __construct(SupplierService $supplierService) {
    $this->supplierService = $supplierService;
}

public function getActiveSuppliersWithCurrent(...) {
   $result = $this->supplierService->activeSuppliersWithCurrent($record);
}

如您所见,以后您将不需要在控制器中进行任何更改。例如,如果您需要更改供应商选择的查询,则只需要更改服务中的内容即可。这样可以使您的代码块分离并缩短。 这种模式的意义还在于:您无需从控制器访问模型。与模型相关的所有逻辑将在服务中实现。 对于其他项目,您只能获取服务或仅获取控制器,并以不同的方式实现另一部分。但是在那种情况下,如果您在控制器中拥有所有代码,那将阻止您获取必要代码的各个部分,因为您可能不记得每个块在做什么……

答案 2 :(得分:1)

您可以在查询中添加where子句以找到该ID。

$suppliers = Supplier::active()->orWhere('id', $record->supplier->id)->get();

通过传递“ id”作为参数,您可能会将其滑入active范围。

public function scopeActive($query, $id = null)
{
    $query->where('active', true);

    if ($id) {
        $query->orWhere('id', $id);
    }
}

Supplier::active($record->supplier->id)->get();

或创建另一个执行此操作的范围。