Cakephp 3 Ассоциативный предел - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь получить товары по категориям.Здесь категории hasMany продуктов.Я пытаюсь получить 3 продукта в категории.Я пробовал ниже код в контроллере

public function test()
{
        $this->viewBuilder()->layout(false);
        $Menus = $this->loadModel( 'Categories' );
        $menu_top = $Menus
                    ->find()
                    ->contain(['Products' , function (Query $q){
                        return $q
                               ->limit('3');
                    }]);

        $this->set('menu_top',$menu_top);
}

После отладки в test.ctp

<?php 
    foreach ($menu_top as $key => $value) {
        debug($value);
    }
?>

Я получил ниже сообщение об ошибке

Unsupported operand types 

Я не нахожулюбая ошибка здесь.

My version : 3.8.4

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Способ передачи аргументов contain неверен.Ниже описано, как вы должны использовать pass, используя стрелку, в противном случае Cakephp принимает его как другое переданное значение массива и, следовательно, ошибку.

    $menu_tops = $Menus
         ->find()
         ->contain([
            'Products' => function($q) {
                return $q
                    ->limit('3');
    }
    ]);     

    foreach( $menu_tops as $key => $value ) {
        debug( $value ); 
    }

0 голосов
/ 21 сентября 2019

Если вы попытаетесь получить товар в категории, вы можете запросить категории и содержать товары.Как вы упоминаете, ваша таблица должна быть одной категории, имеет много продуктов.Этот пример запроса моя помощь:

$conditions = [];
$query = $this->Categoies->find()
        ->select([
            'Categoies.id',
            'Categoies.name',
        ])
        ->contain([
            'Products' => function ($q) {
            return $q->select(['Products.id', 'Products.category_id', 
                              'Products.name']);
        ])
        ->where($conditions);
0 голосов
/ 19 сентября 2019

Вы получаете ошибку, потому что вы передали строку внутрь limit.Параметр предела должен быть integer всегда.

public function test()
{
        $this->viewBuilder()->layout(false);
        $Menus = $this->loadModel( 'Categories' );
        $menu_top = $Menus
                    ->find()
                    ->contain(['Products' , function ($q){
                        return $q
                               ->limit(3);
                    }]);

        $this->set('menu_top',$menu_top);
}
...