【问题标题】:How to set sorting in default repository function in Typo3?如何在 Typo3 的默认存储库功能中设置排序?
【发布时间】:2018-10-27 10:07:49
【问题描述】:

我是这样写的

/**
 * itemRepository
 *
 * @var \KRT\KrtEmployee\Domain\Repository\ItemRepository
 * @inject
 */
 protected $itemRepository = null;

/**
 * action list
 *
 * @return void
 */
public function listAction()
{
    $arguments =$this->request->getArguments();     

    $employees = $this->itemRepository->findAll();        
    $this->view->assign('employees',$employees);
}

在我的 $employees 结果中我有

  • 员工 ID(默认 uid)
  • 姓名
  • 名称
  • 部门
  • 工资

现在,我如何根据 升序 对结果数组进行排序

  1. 姓名
  2. 部门和薪资

是否有任何默认函数可以在存储库查询中进行排序?

【问题讨论】:

    标签: php typo3 typo3-7.6.x typo3-8.x typo3-extensions


    【解决方案1】:

    一般且完整:

    <?php
    namespace <yourVendor>\<yourExtensionkey>\Domain\Repository;
    
    use TYPO3\CMS\Extbase\Persistence\Repository;
    use TYPO3\CMS\Extbase\Persistence\QueryInterface;
    
    class <yourDomain>Repository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    
        protected $defaultOrderings = [
            '<yourProperty1>' => QueryInterface::ORDER_ASCENDING,
            '<yourProperty2>' => QueryInterface::ORDER_DESCENDING
        ];
    }
    

    docs.typo3.org中的进一步解释

    【讨论】:

      【解决方案2】:

      每个存储库都有一个$defaultOrderings 属性,您可以在其中指定应用于所有查询方法的默认排序。在您的情况下,它可能如下所示:

      protected $defaultOrderings = [
          'name' => QueryInterface::ORDER_ASCENDING,
          'department.name' => QueryInterface::ORDER_ASCENDING,
          'salary' => QueryInterface::ORDER_ASCENDING,
      ];
      

      正如您在department.name 中看到的那样,您还可以按关系的属性进行排序。请注意,这仅适用于 1:1 和 n:1 关系。

      如果您的存储库中有自定义查询方法,您可以直接在查询中手动设置排序:

      $query->setOrderings([
          'name' => QueryInterface::ORDER_ASCENDING,
          'department.name' => QueryInterface::ORDER_ASCENDING,
          'salary' => QueryInterface::ORDER_ASCENDING,
      ]);
      

      【讨论】:

        【解决方案3】:

        您有多种选择,具体取决于您想要实现的目标:

        为整个存储库设置默认顺序

        将以下内容添加到您的存储库类中

        protected $defaultOrderings =
            array(
                'department' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
                'salary' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
            );
        

        这将适用于在此存储库中进行的所有查询。

        见:https://wiki.typo3.org/Default_Orderings_and_Query_Settings_in_Repository

        为单个查询设置顺序

        将此添加到您在存储库中定义的查询中

        $query->setOrderings(
            array(
                'department' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
                'salary' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
            )
        );
        

        通过这种方式,您可以(并且必须)为您希望返回的每个排序顺序实现不同的访问方法。

        见:https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html

        对结果进行排序

        您始终可以使用 PHP 排序方法对查询结果进行排序(可能先将其转换为带有-&gt;toArray() 的数组。

        【讨论】:

        • 非常感谢您的详细解释,如果我只想对我在控制器中编写的一个结果进行排序,就像这样$this-&gt;itemRepository-&gt;setDefaultOrderings(array('name' =&gt; QueryInterface::ORDER_DESCENDING)); $employees = $this-&gt;itemRepository-&gt;findAll(); 是否正确?现在我把它作为一个未排序的数组
        • 这应该可以,是的。您是否在未设置默认排序的情况下收到未排序的数组?
        • 不,从您建议的方法中,我正在接收排序后的数组。只有此方法返回未排序的数组。也许我哪里出错了。我的问题已经用你建议的方法解决了,我只是检查了这个方法,如果将来可能需要它。谢谢
        猜你喜欢
        • 1970-01-01
        • 2019-09-13
        • 2022-08-24
        • 2015-02-13
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 2021-01-19
        相关资源
        最近更新 更多