在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配置。
答案 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_id
和news_category_id
等外键。并确保在news_news_categories
表中没有任何主键(如id),因为这两个字段组合起来作为主键。
答案 1 :(得分:0)
终于找到了解决方案。基本上我做了以下步骤:
创建了一个新的php文件来表示关系模型(出于某种原因,我已经明白CakePHP会在幕后自动化)
App::uses('AppModel', 'Model');
class NewsNewsCategory extends AppModel{
var $belongsTo = array('News', 'NewsCategory');
}
将查询代码更改为:
this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)), 'contain' => array('NewsCategory'));
最后我希望将结果放在同一个数组中,如:
$this->data['News']['NewsCategories'] //or anything like that
但我发现相关的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