在CakePHP中如何使Containable行为与Tree行为相配合

时间:2015-01-15 11:13:38

标签: php cakephp cakephp-2.0 containable

我有可容纳的这个问题,我有类似于树的类型模型:

class Category extends AppModel {
  public $actsAs = ['Tree', 'Containable'];

  public $hasMany = [
    'Novelty' => [
      'className' => 'Novelty',
      'foreignKey' => 'category_id',
      'dependent' => false,
    ]
  ]
}

其结构:

Category(
  id int(11)
  name varchar(255)
  parent_id int(11)
  lft int(11)
  rght int(11)
)

我有一个新奇模型:

class Novelty extends AppModel {
  public $actsAs = ['Containable'];

  public $belongsTo = [
    'Category' => [
      'className' => 'Category',
      'foreignKey' => 'category_id',
    ]
  ];
}

新颖结构:

Novelty(
  id int(11)
  name varchar(255)
  category_id int(11)
)

协会

Category -> hasMany -> Novlety
Novelty -> belongsTo -> Category

来自find('threaded')的类别示例结构如下:

['Category'] => [
  'id' => 13
  'name' => 'Main'
  'lft' => 88
  'rght' => 105
  'children' => [
    [0] => [
      ['Category'] => [
        'id' => 131
        'name' => 'sub1'
        'lft' => 89
        'rght' => 90
      ]
    ]
    [1] => [
      ['Category'] => [
        'id' => 132
        'name' => 'sub2'
        'lft' => 91
        'rght' => 92
      ]
    ]
    [...]
  ]
]

现在当我尝试包容时:

$this->Category->contain(
  'Novelty' => [
    'conditions' => [
      'AND' => [
        'Novelty.category_id >=' => 13,
        'Novelty.category_id !=' => 14
      ]
    ]
  ]
);

现在,当我运行Category->find('all')时,结果中没有新奇事物。因为蛋糕增加了自己的条件Novelty.category = (13)。我无法摆脱它,也无法扩展它。所以查询看起来像这样:

SELECT `Novelty`.`id`, `Novelty`.`name`, `Novelty`.`category_id`, 
FROM `databse`.`novelties` AS `Novelty` 
WHERE ((`Novelty`.`category_id` >= 13) 
  AND (`Novelty`.`category_id` < 14)) 
  AND `Novelty`.`category_id` = (13)

是否有任何修改默认查询条件的特殊条件?

我的目标:

获得与子类别相关的新奇事物,不仅仅是那些与主要类别相关的新奇事物。 但它甚至可能吗?

1 个答案:

答案 0 :(得分:2)

  

现在,当我运行Category-&gt; find(&#39; all&#39;)时,结果中没有新奇事物。   因为蛋糕添加了自己的条件Novelty.category =(13)。和我   不能摆脱也不能扩大它。所以查询看起来像这样:

这是代码的正确行为。你有一个Cateogry hasMany 新奇的关联,为了实现这一点,Cake添加条件。

对我而言,您似乎想要查找所有新奇记录除了类别ID为14的那些,是吗?

临时unbindModel()您的Novelty关联并将其添加为hasOne assoc,不带外键但条件为:

['conditions' => ['Novelty.cateogry_id !=' 14]]

或使用查询的the joins array