使用 lumen 为数据库中的所有表设置默认顺序

Posted

技术标签:

【中文标题】使用 lumen 为数据库中的所有表设置默认顺序【英文标题】:Setting default order for all the tables in a database using lumen 【发布时间】:2021-07-08 16:32:53 【问题描述】:

我有一个使用 lumen 编写的完整应用程序。申请完成。我只需要为应用程序中的每个查询添加 order by 子句,这在某种程度上需要添加时间。到处搜索后,我找到了以下方法。

protected static function boot() 
    parent::boot();
    static::addGlobalScope('order', function (Builder $builder) 
    $builder->orderBy('date', 'desc');
   );

我必须在每个模型中添加上述功能。这也是一个合理的解决方案,但我不想这样做。我想在一个地方添加这个功能,而不是像在任何服务提供商或其他地方那样添加每个模型。我对这个框架不太熟悉。如果有人知道其解决方案,请提供帮助。请注意,order by 的时间戳字段名称具有不同的前缀。例如。 tbl_created_at 是名为 column 的表中的 Created_at 字段,而 prnt_created_at 字段是名为 prints 的表中的 Created_at 字段。感谢您的帮助。

【问题讨论】:

【参考方案1】:

此代码是此问题的无错误解决方案。

1:第一步创建特征

   <?php
     namespace App\Traits;
     use Illuminate\Database\Eloquent\Builder;
     trait DefaultOrderByDate
     
        protected static function boot() 
        parent::boot();

        $field = self::CREATED_AT;

         static::addGlobalScope('order', function (Builder $builder) use ($field) 
            $builder->orderBy($field, 'desc');
         );
       
    

2:创建trait后创建模型

<?PHP
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Traits\DefaultOrderByDate;

class SomeModel extends Model

  use DefaultOrderByDate;

  /**
   * The name of the "created at" column.
   *
   * @var string
   */
  const CREATED_AT = 'prnt_created_at';

  /**
   * The name of the "updated at" column.
   *
   * @var string
   */
   const UPDATED_AT = 'prnt_updated_at';

【讨论】:

【参考方案2】:

将其设为trait,在 trait 中您仍然可以使用正在使用该 trait 的类中的方法和变量:

<?php
namespace App\Traits;

trait DefaultOrderByDate

    protected static function boot() 
        parent::boot();

        $field = parent::CREATED_AT;

        static::addGlobalScope('order', function (Builder $builder) use ($field) 
            $builder->orderBy($field, 'desc');
        );
    

现在在你的模型中你可以像这样使用它们:

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Traits\DefaultOrderByDate;

class SomeModel extends Model

   use DefaultOrderByDate;

    /**
     * The name of the "created at" column.
     *
     * @var string
     */
    const CREATED_AT = 'prnt_created_at';

    /**
     * The name of the "updated at" column.
     *
     * @var string
     */
    const UPDATED_AT = 'prnt_updated_at';

【讨论】:

谢谢,但您没有阅读完整的问题。对于模型中定义的每个表,字段名称“Created_at”将不同。 Created_at="tbl_created_at" 抱歉,再次更正了我的答案...parent 是包含特征的类,未经测试,但我希望这应该可以帮助您入门。 你能分享一个更改时间戳的示例模型吗?你能分享你遇到的任何错误吗? 非常感谢这段代码在解决了一些问题后对我有用。

以上是关于使用 lumen 为数据库中的所有表设置默认顺序的主要内容,如果未能解决你的问题,请参考以下文章

当 `OrdinalBase` 字段设置为 1 时,`kernel32.dll` 如何导出 0 的序数?

Laravel/lumen 5.2 从现有数据库生成迁移表

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

无法为测试设置单独的数据库 - Laravel/Lumen

在 Lumen 中使用验证器进行工匠命令

有关lumen的一些设置