CakePHP可容纳的条件不限制结果?

时间:2013-03-30 17:03:34

标签: cakephp containable

我正在尝试在分类列表中找到用户的杂货。关联是Category hasMany Item hasMany User through Grocery。我正在使用可包含行为,并没有过滤掉所有其他Grocery。它基本上返回每个项目。

我的控制器功能:

function showlist() {
$categories = $this->Category->find('all', array(
    'contain' => array(
        'Item' => array(
            'Grocery' => array(
                'conditions' => array(
                    'Grocery.user_id =' => $this->Auth->user('id')
                )
            )
        )
    )
));

返回的数组:

Array
(
    [0] => Array
        (
            [Category] => Array
                (
                    [id] => 10
                    [parent_id] => 
                    [name] => Dairy
                    [lft] => 1
                    [rght] => 6
                )

            [Item] => Array
                (
                )

        )

[1] => Array
    (
        [Category] => Array
            (
                [id] => 11
                [parent_id] => 10
                [name] => Milk
                [lft] => 2
                [rght] => 3
            )

        **[Item] => Array
            (
            )**

    )

[2] => Array
    (
        [Category] => Array
            (
                [id] => 12
                [parent_id] => 10
                [name] => Cheese
                [lft] => 4
                [rght] => 5
            )

        [Item] => Array
            (
            )

    )

[3] => Array

我不想返回任何没有Grocery(ItemUser)的Item数组。


这有效,但现在它只能展示。我需要它来显示该嵌套数组中的一个类别的所有项目。

它显示:

Array
(
[0] => Array
    (
        [Category] => Array **<--This could be the same category as**
            (...)

        [Item] => Array
            (...)

        [Grocery] => Array
            (...)
    )
[1] => Array
    (
        [Category] => Array **<--This**
            (...)

        [Item] => Array
            (...)

        [Grocery] => Array
            (...)
    )
[2]...

我需要它:

Array
(
[0] => Array
    (
        [Category] => Array 
            (...
            [Item] => Array
            (...)

            [Item] => Array
            (...)
            )
    )
[1] => Array
    (
        [Category] => Array
            (...)

        [Item] => Array
            (...)
    )
[2]...

甚至不需要Grocery数组,只需通过它们搜索标准。

2 个答案:

答案 0 :(得分:6)

您无法根据Contain中的条件限制主要模型的结果。当您使用contain()时,它实际上会创建多个查询 - 这使您无法根据所包含的条件进行限制。

要解决此问题,您需要使用JOIN [ see CakePHP Joining Tables ]而不是包含。

答案 1 :(得分:0)

如果你想要嵌套格式,你可以将所有这些移动到另一个(例如Groceries)控制器,这将允许你通过user_id限制或(但我不得不承认我不确定这是否是好蛋糕练习,虽然我已经成功地使用了这种方法......无论如何,在1.3中的某些方面:

$groceries = $this->Category->Item->Grocery->find('all', array(
    'conditions' => array(
         Grocery.user_id =' => $this->Auth->user('id')
    )
));