laravel - 最佳实践 - Laravel Controller Eloquent 合并

标签 laravel eloquent controller

我的供应商模型有一个范围,它返回 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/

相关文章:

javascript - app.message 在 Laravel 中使用 Vue 在控制台中返回 undefined

php - Laravel eloquent find max(date) 以及附加搜索条件

laravel - 用户无法登录从 Laravel 8 中的自定义注册页面注册的用户

laravel - Laravel 的错误日志的位置在哪里?

php - 列出资源时检查关系

error-handling - 动态设置错误 Action 的布局文件

php - 我可以在 init() 方法中取消 Zend Controller 操作吗?

java - @Controller 的 Spring Boot Whitelabel 错误?

php - 未知的数据库

php - 在 Laravel 中将数组转换为 Eloquent 模型