我的供应商模型有一个范围,它返回 active = true
的结果。
这在创建新条目时非常有用,因为我只希望用户看到活跃的供应商。
当前条目可能有不活跃的供应商;当我编辑它时,我想查看所有活跃的供应商,加上当前的供应商(如果它是非活跃的)
我的 Controller 中有以下代码:
$suppliers = Supplier::active()->get();
if (!$suppliers->contains('id', $record->supplier->id))
{
$suppliers->add(Supplier::find($record->supplier->id));
}
两个问题:这是正确的方法吗?这段代码应该在我的 Controller 中还是应该放在其他地方? (也许是一个范围,但我不知道如何编码)。
编辑:
谢谢大家的帮助。我已经应用了每个答案的建议,并将我的代码重构到一个新的范围中:
public function scopeActiveIncluding($query, Model $model = null)
{
$query->where('active', 1);
if ($model && !$model->supplier->active)
{
$query->orWhere('id', $model->supplier->id);
}
}
最佳答案
您编写的内容可以工作,但是如果集合很大,Collection::contains
函数可能会非常慢。
既然你有id,我可能会进行以下更改:
$suppliers = Supplier::active()->get();
$supplier = Supplier::find($record->supplier->id);
if (!$supplier->active) {
$suppliers->add($supplier);
}
当然,这样做的缺点是您可能对数据库进行不必要的查询。
所以你必须考虑:
记录
的供应商更有可能处于活跃状态还是不活跃状态?- 活跃供应商集合的规模是否足够大,足以证明有必要再次(可能浪费)数据库调用?
根据您对应用程序数据的了解,做出最有意义的选择。
对于第二个问题,如果您在应用程序的这一部分中只需要这组特定的供应商,那么 Controller 是放置此代码的好地方。
但是,如果您在应用程序的其他部分需要这组特定的供应商,那么您可能应该将此代码移到其他地方。在这种情况下,在相关模型(无论 $record
是什么类型...)上创建一个返回该模型的供应商集的函数可能是有意义的。像这样的东西:
public function getSuppliers()
{
$suppliers = Supplier::active()->get();
$supplier = $this->supplier;
if (!$supplier->active) {
$suppliers->add($supplier);
}
return $suppliers;
}
关于laravel - 最佳实践 - Laravel Controller Eloquent 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58192732/