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_idnews_category_id 等外键。并确保您在 news_news_categories table 中没有任何主键(如 id),因为这两个字段共同用作主键。

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

  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
    

但我发现相关的 NewsCategory 记录在另一个变量上可用:

$this->data['NewsCategory']

(并没有像我最初假设的那样嵌套在新闻结果数组中)

谢谢大家。我希望这对以后的其他人有所帮助。