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(), който ще създаде INNER JOIN с 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, refund_price_unit_id, sum(refund_price) от (изберете refund_price_unit_id refund_price_unit_id, (изберете product_type_id от продукти, където id = a.product_id) product_type, refund_price от refund_products a) b група по product_type, refund_price_unit_id; не знам как да правя заявка в Cakephp Model - person Cao Thế Cường; 28.05.2015
comment
@Cao Първо, моля, прочетете това ръководство: Конструктор на заявки. Там можете да намерите всичко необходимо за създаване и допълнително персонализиране на вашите заявки. След това, ако все още ще имате проблеми с работата на заявките си, можете да публикувате друг въпрос с вашия конкретен проблем. - person ; 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