在 CakePHP 中,如何使 Containable 行为与 Tree 行为合作


In CakePHP how to make Containable behavior cooperate with Tree behavior

我在可包含方面遇到了这个问题,我有行为像树的类别模型:

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)

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

我的目标:

获取与子类别相关的新奇事物,而不仅仅是与主类别相关的新奇事物。但这甚至可能吗?

现在,当我运行类别>查找('全部')时,结果中没有新奇事物。 因为蛋糕增加了自己的条件 新奇性类别 = (13).而我 无法摆脱或扩展它。所以查询看起来像这样:

这是代码的正确行为。你有一个分类有许多新奇的关联,要做到这一点,蛋糕增加了条件。

对我来说,您似乎想找到除类别 ID 14 之外的所有新奇记录,对吗?

临时取消绑定模型()您的新奇关联,并将其添加回hasOne没有外键但有条件的assoc:

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

或者使用查询的联接数组。