Модель запроса Cakephp3

Вот моя модель продукта:

$this->table('products');
$this->belongsTo('OrderProducts', [
    'foreignKey' => 'order_product_id',
    'propertyName' => 'order_product',
    'joinType' => 'INNER'
]);
$this->hasMany('RefundProducts', [
    'foreignKey' => 'product_id',
    'sort' => ['RefundProducts.created' => 'DESC'],
    'propertyName' => 'refund_products',
    'className' => 'RefundProducts'
]);

Мой запрос:

$result = $this->Products->find('all', [
    'contain' => [
        'RefundProducts' => [
            'PriceUnits',
            'conditions' => $refund_condition,
        ]
    ]
]);

но он получает весь продукт, я хочу получить только продукт с RefundProducts


person Cao Thế Cường    schedule 27.05.2015    source источник


Ответы (3)


Это работа для метода matching(), который создаст ВНУТРЕННЕЕ СОЕДИНЕНИЕ с RefundProducts, поэтому вы получите только Products, у которых есть несколько RefundProducts. Условия в contain ограничивают только извлеченные ассоциации

 $result = $this->Products->find()
    ->contain(['RefundProducts' => function ($q) use ($refund_condition) {
        return $q->where($refund_condition);
    }])
    ->matching('RefundProducts')
    ->distinct(['Products.id']);

Я не уверен, что $refund_condition должен делать. В этом примере будут получены Products, которые содержат некоторое количество RefundProducts, но будут содержать RefundProducts только в том случае, если $refund_condition удовлетворено (поэтому RefundProducts может вернуться как пустое). В качестве альтернативы, в зависимости от того, что вы хотите отфильтровать, вы можете сделать это следующим образом.

->contain(['RefundProducts'])
->matching('RefundProducts', function ($q) use ($refund_condition) {
    return $q->where($refund_condition);
})
person Community    schedule 28.05.2015
comment
выберите product_type, return_price_unit_id, sum(refund_price) from (выберите return_price_unit_id return_price_unit_id, (выберите product_type_id из продуктов, где id = a.product_id) product_type, return_price из return_products a) b сгруппируйте по product_type , return_price_unit_id; я не знаю, как сделать запрос в запросе модели Cakephp - person Cao Thế Cường; 28.05.2015

Cao Thế Cường, вы пробовали реляционный запрос следующим образом:

$result = Products->find()->contain(['RefundProducts' => function ($q) {
   return $q
        ->select(['field1', 'field2'])
        ->where(['refunded_product' => true])]);
person Jatin Bansal    schedule 27.05.2015

Используйте where, чтобы проверить, используется ли столбец связанной таблицы (в данном случае RefundProducts):

// in your query-object
$query->where(['Table.column IS NOT NULL']);
person Bob    schedule 27.05.2015