【问题标题】:Cakephp 3 _matching, how format results dataCakephp 3 _matching,如何格式化结果数据
【发布时间】:2016-06-08 11:33:01
【问题描述】:

我的查询如下:

$test = $this->Producers->find()
    ->hydrate(true)
    ->select(['Producers.id','Producers.name', 'Products.id', 'Products.name']);

    $test->matching(
            'Products.Categories', function ($q) {
                return $q->where(['Categories.id' => 22]);
    } );

这个查询使用了内连接,返回的数据自然看起来像

|Producers_id|Producers_name|Products_id|Products_name|
-------------------------------------------------------
|1           |Canon         |1          |EOS 1000D    |
-------------------------------------------------------
|1           |Canon         |2          |EOS 300D     |
-------------------------------------------------------
|1           |Canon         |3          |EOS 50D      |
-------------------------------------------------------
|3           |Nikon         |6          |D600         |
-------------------------------------------------------
|3           |Nikon         |7          |D100         |
-------------------------------------------------------

在看来,在 foreach 迭代之后,我每行都有生产者和产品:

=============================
Producer: Canon
-----------------------------
EOS 1000D
=============================
Producer: Canon
-----------------------------
EOS 300D
=============================
Producer: Canon
-----------------------------
EOS 50D
=============================

但我希望格式化数据如下:

=============================
Producer: Canon
-----------------------------
EOS 1000D
-----------------------------
EOS 300D
-----------------------------
EOS 50D
=============================
Producer: Nikon
-----------------------------
D600
-----------------------------
D100
=============================

最佳的数据格式化做法是什么?在视图中,还是模型/控制器?也许使用 mapReduce()?

【问题讨论】:

    标签: cakephp cakephp-3.0 has-and-belongs-to-many cakephp-3.x


    【解决方案1】:

    最佳实践与否,使用Cake\Collection\Collection,您可以对结果进行分组:

    $collection = new Collection($test);
    $byProducer = $collection->groupBy('Producers_name')->toArray();
    

    这将导致:

    [Canon] => Array
        (
            [0] => Array
                (
                    [Producers_id] => 1
                    [Producers_name] => Canon
                    [Products_id] => 1
                    [Products_name] => EOS 1000D
                )
    
            [1] => Array
                (
                    [Producers_id] => 1
                    [Producers_name] => Canon
                    [Products_id] => 2
                    [Products_name] => EOS 300D
                ) ...
        )
    
    [Nikon] => Array
        (
            [0] => Array
                (
                    [Producers_id] => 3
                    [Producers_name] => Nikon
                    [Products_id] => 6
                    [Products_name] => D600
                ) ...
        )
    

    【讨论】:

    • $test already is a collection(有点)。此外,您必须按name 分组,使用 OP 显示的查询,结果实体中将没有Producers_name
    • code-kobolt:效果很好,谢谢! ndm 你有权利,只需要:$byProducer = $test->groupBy('Producers_name')->toArray(); 没有“use Cake\Collection\Collection;”和$collection = new Collection($test);
    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多