CakePHP选择多对多(HABTM)记录

时间:2015-02-20 20:52:56

标签: php cakephp many-to-many has-and-belongs-to-many

在2个类之间创建多对多(HABTM)关系后(如下面的代码)我期待看到包括相关记录在内的结果,但由于某种原因,这种情况并没有发生。

模型

App::uses('AppModel', 'Model');
class NewsCategory extends AppModel{
  public $hasAndBelongsToMany = array('News');
}

App::uses('AppModel', 'Model');
class News extends AppModel{
  public $hasAndBelongsToMany = array('NewsCategory');
}

我创建了一个名为“news_news_categories”的表格,其中包含两个表格。

控制器

this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)));

上述代码的结果不包含相关的NewsCategory记录。

花了好几个小时试图实现这一目标后,我无法完成这项工作。

我在这里缺少什么?

提前谢谢大家!


更新

当我使用

转储CakePHP使用的SQL代码时
echo $this->element('sql_dump');

结果未显示此关系的任何查询(或加入)。 CakePHP只是忽略了$ hasAndBelongsToMany配置。

3 个答案:

答案 0 :(得分:0)

你按照cakephp遵循编码惯例,或者你的代码只是Not work as expected,否则你将不得不使用像$useTable = etc这样的脏技巧。

您的问题是HABTM的表名应为

1.所有小写字母

2.它应该有两个表名(复数形式)。

3.Plural tables names(即Words)应按字母顺序排列/

4.您的表名之间应该有下划线。

根据规则,您的表名应为news_news_categories

同时在表news_news_categories中确保您拥有news_idnews_category_id等外键。并确保在news_news_categories表中没有任何主键(如id),因为这两个字段组合起来作为主键。

答案 1 :(得分:0)

终于找到了解决方案。基本上我做了以下步骤:

  1. 创建了一个新的php文件来表示关系模型(出于某种原因,我已经明白CakePHP会在幕后自动化)

    App::uses('AppModel', 'Model');
    class NewsNewsCategory extends AppModel{
      var $belongsTo = array('News', 'NewsCategory');
    }
    
  2. 将查询代码更改为:

    this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)), 'contain' => array('NewsCategory'));
    
  3. 最后我希望将结果放在同一个数组中,如:

    $this->data['News']['NewsCategories'] //or anything like that
    
  4. 但我发现相关的NewsCategory记录可用于另一个var:

    $this->data['NewsCategory']
    

    (并没有嵌套在新闻结果数组中,正如我先假设的那样)

    谢谢大家。我希望将来能帮助其他人。

答案 2 :(得分:-1)

我认为这是CakePHP约定的问题。所以你只需将使用表名放在模型中。 像是

App::uses('AppModel', 'Model');
class NewsCategory extends AppModel{
    public $useTable = 'news_categories'; 
    // This model uses a database table 'news_categories'
    public $hasAndBelongsToMany = array('News');
}

App::uses('AppModel', 'Model');
class News extends AppModel{
    public $useTable = 'news'; // This model uses a database table 'news'
    public $hasAndBelongsToMany = array('NewsCategory');
}

另请阅读CakePHP Books