如何使ResultSet作为Collection的实例?

时间:2018-08-17 07:04:18

标签: php cakephp cakephp-3.x

我有这个QueryService函数:

public static function findAllOrderStatus(): Collection
{
    $orders = TableRegistry::get('b2c_orders');
    $query = $orders->find();

    return $query->select([
        'shop_code' => 'm.mall_code',
        'order_id' => 'b2c_order_number',
        'ship_status' => 'status',
    ])
        ->join([
            'table' => 'malls',
            'alias' => 'm',
            'type' => 'INNER',
            'conditions' => 'b2c_orders.mall_uuid = m.mall_uuid',
        ])
        ->where([
            'm.mall_code' => MALL_ALPEN_OWN
        ])
        ->all();
}

我遇到了一个错误

Exception: Return value of findAllOrderStatus() must be an instance of Cake\Collection\Collection, instance of Cake\ORM\ResultSet returned

如何使$ query-> select成为集合?

2 个答案:

答案 0 :(得分:1)

如果您想要Cake\ORM\ResultSet的实例,则可以采用其他方法。为什么不使用以下方式?

 $iteratorObject = $orders->find() 
     ->join([
        'table' => 'malls',
        'alias' => 'm',
        'type' => 'INNER',
        'conditions' => 'b2c_orders.mall_uuid = m.mall_uuid',
    ])
    ->where([
        'm.mall_code' => MALL_ALPEN_OWN
    ]); 

如果您想使用all()toList(),请找到它Selecting Rows From A Table

我不认为select可以直接转换为集合对象。但是,您可以采取其他黑客方式来实现您的目标。您可以在返回时将类型转换为对象。像

(object) $array;

如果要执行此操作,请删除all()并键入强制转换并将其返回。

如果您的数组是多维数组,我是在Richard Castera

中找到的
function arrayToObject($array) {
    if (!is_array($array)) return $array;

    $object = new stdClass();
    if (is_array($array) && count($array) > 0) {
        foreach ($array as $name=>$value) {
            $name = strtolower(trim($name));
            if (!empty($name)) $object->$name = arrayToObject($value);
        }
        return $object;
     }else {
        return false;
     }
}

希望获得帮助

答案 1 :(得分:1)

如果该方法驻留在表类中,则应重新考虑其名称,因为以find开头的表类方法可以用作finders,并且查找器必须返回查询对象。

也就是说,如果您确实希望该方法公开与集合兼容的返回值,则将返回类型声明为\Cake\Collection\CollectionInterface,而\Cake\ORM\ResultSet是通过\Cake\Datasource\ResultSetInterface间接实现的。

另请参见 API > \Cake\Collection\CollectionInterface