【问题标题】:How to append to a CakePHP3 ResultSet?如何附加到 CakePHP3 ResultSet?
【发布时间】:2016-09-17 02:52:42
【问题描述】:

我有一个查询(一个查询对象):

$joblineitems = $this->JobLineItems->find('all');

它有结果(一个 ResultSet 对象):

$joblineitemsresults = $joblineitems->all();

ResultSet 对象是一个 Iterable,因此 foreach() 循环将返回每个 JobLineItem 对象。

我只是想在 $joblineitemsresults 中添加一个额外的结果 - 特别是我想在结果的末尾附加一个 $this->JobLineItems->newEntity() 以便当我随后对 $joblineitemsresults 进行分页并循环遍历它时在视图中,最后一页循环中的最后一个对象将是一个空白对象,其属性为 new=true。

如何手动将额外结果附加到 ResultSet 对象?

【问题讨论】:

    标签: cakephp iterator cakephp-3.0


    【解决方案1】:

    试试这个

    $joblineitems = $this->JobLineItems->find('all');
    $joblineitemsresults = $joblineitems->all();
    
    $joblineitemsresults = $joblineitemsresults ->append([$this->JobLineItems->newEntity()]);
    debug($joblineitemsresults ->toList());
    

    可以参考manual

    特别注意最后一段

    当从不同的来源追加时,您可以期望一些键来自 两个集合是相同的。例如,当附加两个 简单的数组。这可能会在转换集合时出现问题 使用 toArray() 到一个数组。如果你不想要一个值 集合以根据他们的密钥覆盖前一个中的其他人, 确保您调用 toList() 以删除键和 保留所有值。

    这就是我使用toList() 而不是toArray() 的原因。如果您使用toArray(),您将看到新实体覆盖了第一个实体。

    当然你也可以将你的记录集转换成一个数组,然后将新实体追加到数组中

    $joblineitemsresults = $joblineitems->toArray();
    joblineitemsresults[] = $this->JobLineItems->newEntity();
    

    【讨论】:

    • 我将其标记为正确,因为它按照我的要求执行 - 但我发现我不能在 $joblineitemsresults 上使用 Paginator,它必须在 QUERY 本身 $joblineitems 上。您知道我是否可以在查询 $joblineitems 内将 newEntity 附加到查询结果的底部,以便对 newEntity 进行分页?
    • 我认为您必须创建一个自定义分页器才能获得它。但也许您可以欺骗分页器:修改您的查询,使其找到更多记录(即使用联合),然后在分页后用新实体替换该记录。这不是一个非常干净的方法,我知道
    • 谢谢你,我同意它很快就会失控。突然间,我很羡慕 2 天的蛋糕,当时 find 返回了一个数组,而不是具有受保护属性的对象,并且没有公共方法来更改所述受保护属性的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多