我在我的供应商模型上有一个范围,该范围在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));
}
答案 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();
或创建另一个执行此操作的范围。