CakePHP select 多对多 (HABTM) 记录
CakePHP select many to many (HABTM) records
在 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');
}
我用两个 table 的 ID 创建了一个名为 "news_news_categories" 的 table。
控制器
this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)));
上述代码的结果不包括相关的 NewsCategory 记录。
我花了几个小时试图实现这一点,但我无法完成它。
我在这里缺少什么?
提前谢谢大家!
更新
当我使用
转储 CakePHP 使用的 SQL 代码时
echo $this->element('sql_dump');
结果未显示对此关系的任何查询(或加入)。 CakePHP 只是忽略了 $hasAndBelongsToMany 配置。
我认为这是 CakePHP 约定的问题。所以你只需在你的模型中使用 use table 名称。
像
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
您应该遵循 cakephp 的编码约定,否则您的代码将只是 Not work as expected
,否则您将不得不使用像 $useTable = etc
这样的肮脏技巧。
你的问题是你的 table HABTM 名称应该是
1.All小写字母
2.It 应该有两个 table 名字(复数形式)。
3.Plural tables 名称(即单词)应按字母顺序排列/
4.There 应在您的 table 名称之间加下划线。
根据规则,你的 table 名字应该是 news_news_categories
.
还要确保在 table news_news_categories
中有 news_id
和 news_category_id
等外键。并确保您在 news_news_categories
table 中没有任何主键(如 id),因为这两个字段共同用作主键。
终于找到解决办法了。基本上我做了以下步骤:
创建了一个新的 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 记录在另一个变量上可用:
$this->data['NewsCategory']
(并没有像我最初假设的那样嵌套在新闻结果数组中)
谢谢大家。我希望这对以后的其他人有所帮助。
在 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');
}
我用两个 table 的 ID 创建了一个名为 "news_news_categories" 的 table。
控制器
this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)));
上述代码的结果不包括相关的 NewsCategory 记录。
我花了几个小时试图实现这一点,但我无法完成它。
我在这里缺少什么?
提前谢谢大家!
更新
当我使用
转储 CakePHP 使用的 SQL 代码时echo $this->element('sql_dump');
结果未显示对此关系的任何查询(或加入)。 CakePHP 只是忽略了 $hasAndBelongsToMany 配置。
我认为这是 CakePHP 约定的问题。所以你只需在你的模型中使用 use table 名称。 像
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
您应该遵循 cakephp 的编码约定,否则您的代码将只是 Not work as expected
,否则您将不得不使用像 $useTable = etc
这样的肮脏技巧。
你的问题是你的 table HABTM 名称应该是
1.All小写字母
2.It 应该有两个 table 名字(复数形式)。
3.Plural tables 名称(即单词)应按字母顺序排列/
4.There 应在您的 table 名称之间加下划线。
根据规则,你的 table 名字应该是 news_news_categories
.
还要确保在 table news_news_categories
中有 news_id
和 news_category_id
等外键。并确保您在 news_news_categories
table 中没有任何主键(如 id),因为这两个字段共同用作主键。
终于找到解决办法了。基本上我做了以下步骤:
创建了一个新的 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 记录在另一个变量上可用:
$this->data['NewsCategory']
(并没有像我最初假设的那样嵌套在新闻结果数组中)
谢谢大家。我希望这对以后的其他人有所帮助。