【问题标题】:Can I set the default order on the Table class on cakephp3我可以在 cakephp3 上的 Table 类上设置默认顺序吗
【发布时间】:2015-12-19 05:31:09
【问题描述】:

在 CakePHP 2.x 中,模型中有一个属性 $order。所以我使用这个属性来对我的数据进行全局排序。因此,例如假设我需要在用于添加行的Country 模型中的视图上显示一个带有国家/地区的选择框:

$order = 'Country.country DESC';

然后当我从任何控制器获取国家/地区时,数据按国家/地区名称排序,而不是按id 或任何其他字段排序。这对于选择框特别有用。在 CakePHP 3.x 上,我似乎在文档中找不到任何类似的参考资料。

我可以做些什么来在获取数据时对数据进行全局排序,而不是在每个查找中使用 order 选项?

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    只需将您心爱的属性添加回去,然后使用 Table 对象中的 beforeFind() 回调将属性中的值添加到查询中。

    或者只是create a custom finder:

    public function findOrdered(Query $query, $options) {
        return $query->order([
            $this->alias() . '.name' => 'ASC'
        ]);
    }
    

    并使用它

    $this->find('list')->find('ordered')->all();
    

    或者创建一个有序列表 find 来返回整个有序列表。

    public function findOrderedList(Query $query, $options) {
        return $this->findList($query, $options)
        ->order([
            $this->alias() . '.name' => 'ASC'
        ]);
    }
    

    或者直接重载findList()方法,调用父类。

    或者,如果您的find() 是通过关系调用的,您可以使用sort 选项来set the default order for the relationship

    $this->hasMany('AuditLogs', [
        'sort' => [
            'AuditLogs.timestamp' => 'desc',
        ],
    ]);
    

    【讨论】:

    • 我推荐$this->aliasField('name') 而不是与->alias() 串联
    • @burzum 是否有您所说的 beforeFind 选项的示例?
    【解决方案2】:

    根据官方文档,请参阅cakephp book,您可以在控制器对象中添加一个公共变量以设置默认排序顺序:

    class InvoicesController extends AppController
    {
        public $paginate = [
            'order' => [
                    'Invoices.id' => 'desc'
            ]
        ];
    
    ....
    

    【讨论】:

      【解决方案3】:

      在 CakePHP 3.x 中,如果你想为模型的每个查询设置默认顺序,那么你可以在你的表中放置以下代码:

      public function beforeFind ($event, $query, $options, $primary) 
      {
          $order = $query->clause('order');
          if ($order === null || !count($order)) {
              $query->order( [$this->alias() . '.sort_field_name' => 'sort_order'] );
          }
      }
      

      如果从外部设置了任何order,它将跳过默认顺序。否则,它将始终按照sort_field_name 排序,根据sort_order

      【讨论】:

        【解决方案4】:

        CakePHP3.x:

        如果您想为与该模型相关的每个查询对模型中的数据进行排序,您可以通过 beforeFind 对模型文件中的查询进行简单排序:

        public function beforeFind(Event $event, Query $query, $options, $primary) {
        
            $query->order(['Model.field' => 'ASC']);
            return $query;
        
        }
        

        【讨论】:

          【解决方案5】:

          您可以在表类中覆盖 findAll 方法。

          public function findAll(Query $query, array $options)
          {
              return $query->order(['Country.country' => 'DESC']);
          }
          

          【讨论】:

          • 小心!将非常全球化。
          猜你喜欢
          • 1970-01-01
          • 2011-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2018-10-14
          • 1970-01-01
          • 2015-09-08
          相关资源
          最近更新 更多