【问题标题】:In CakePHP how to make Containable behavior cooperate with Tree behavior在 CakePHP 中如何使 Containable 行为与 Tree 行为配合
【发布时间】:2015-01-16 04:21:10
【问题描述】:

我有这个可包含的问题,我的类别模型表现得像一棵树:

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)

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

我的目标:

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

【问题讨论】:

    标签: php cakephp cakephp-2.0 containable


    【解决方案1】:

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

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

    在我看来,您似乎想要查找所有 Novelty 记录除了类别 id 为 14 的记录,对吗?

    临时 unbindModel() 你的 Novelty 关联并将其添加为没有外键但有条件的 hasOne 关联:

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

    或者使用the joins array的查询。

    【讨论】:

    • 我忘了说类别是一棵树。所以我想获得 Category = 13 及其子项的所有 Novelty。我的约定是所有子类别的编号都以 13 开头。但现在我发现条件是错误的,直到我将 id 设置为按语言顺序排序。反正。我想获取类别 = 13 及其子项的所有新奇事物
    • "我的约定是所有子类别的数字都以 13 开头。"这听起来不像行为的树结构的任何两种受支持的类型(父子、嵌套集)。但是,使用联接而不是可包含的行为来构建您需要的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多