【问题标题】:CakePHP select many to many (HABTM) recordsCakePHP 选择多对多 (HABTM) 记录
【发布时间】:2015-02-20 20:52:55
【问题描述】:

在 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”的表,其中两个表都有 id。

控制器

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

以上代码的结果不包括相关的 NewsCategory 记录。

花了几个小时试图实现这一点后,我无法完成。

我在这里缺少什么?

提前谢谢大家!


更新

当我转储 CakePHP 使用的 SQL 代码时

echo $this->element('sql_dump');

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

【问题讨论】:

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


    【解决方案1】:

    您应该遵循 cakephp 的编码约定,否则您的代码将只是 Not work as expected,或者您将不得不使用像 $useTable = etc 这样的脏技巧。

    你的问题是你的 HABTM 表名应该是

    1.全部小写

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

    3.复数表名(即单词)应按字母顺序排列/

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

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

    还要确保在您的表 news_news_categories 中有外键,例如 news_idnews_category_id。并确保您在news_news_categories 表中没有任何主键(如 id),因为这两个字段共同用作主键。

    【讨论】:

    • 对不起,是一个打字错误(在我原来的问题上修正了它)。如您所述,该表的名称已经小写。为什么连接表(news_news_categories)不能有 id 列?我问是因为它有 id 列并且我在创建记录时没有任何问题......只有在选择它不起作用时
    • 顺便说一句,我刚刚开始工作,不需要从关系表中删除 id 列。感谢您的帮助!
    【解决方案2】:

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

    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 记录在另一个 var 上可用:

    $this->data['NewsCategory']
    

    (而不是像我最初设想的那样嵌套在 News 结果数组中)

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

    【讨论】:

      【解决方案3】:

      我认为这是 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

      【讨论】:

      • 为什么我要将我的 NewsCategory 模型表命名为“news_news_categories”??
      • “news_news_categories”应该是“news_categories”,是类型错误。
      • 实际上这不是问题,因为所有表格都遵循约定。无论如何感谢您的支持
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多