cakephp 中的正确模型关联

Posted

技术标签:

【中文标题】cakephp 中的正确模型关联【英文标题】:Correct model associations in cakephp 【发布时间】:2015-02-05 09:56:24 【问题描述】:

我使用HABTM 来填充数据库。我有 3 个模型。用户,书籍,评论。 为了加入我在 HABTM users_books 表中使用的表 books 和 users 中的记录,并绑定 cmets,我使用了两个主键 user_id 和 book_id,它们都被设置为外键:

PRIMARY KEY (user_id, book_id)
FOREIGN KEY (user_id, book_id) REFERENCES users_books (user_id, book_id)

表格书和users_books 正在填充,但在某些情况下,我可以填充评论表,但只有user_id 和book_id,其他数据为NULL。或者如果我从我得到的 saveAll 查询中删除 user_id(注释数组):

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 

所以我猜它要么违反 cakephp 约定,要么我做错了什么。

这是示范书的部分:

  public $hasAndBelongsToMany = array(
  'User' =>
  array(
    'className' => 'User',
      'joinTable' => 'users_books',
        'foreignKey' => 'book_id',
        'associationForeignKey' => 'user_id',
        'unique' => true,
    'conditions' => '',
    'fields' => 'book_id',
    'order' => '',
    'limit' => '',
    'offset' => '',
    'finderQuery' => '',

),
'Comment' =>
array(
  'className' => 'Comment',
  'joinTable' => 'comments',
  'foreignKey' => 'book_id',
  'associationForeignKey' => 'user_id',
  'unique' => true,
  'conditions' => '',
  'fields' => '',
  'order' => '',
  'limit' => '',
  'offset' => '',
  'finderQuery' => '',),);

并评论:

public $belongsTo = array (
'Book' => array (

'foreignKey'=>false,
'conditions'=> array('Comment.book_id = UserBook.book_id')));

编辑:

要保存的数据

$this->request->data['Book']['title'] = "title".rand(1,1220);
$this->request->data['Book']['author'] = "author".rand(1,1220);
$this->request->data['User']['id'] = $this->Auth->user('id');
$this->request->data['Book']['Comment']['body'] = "cm: ".rand(1,1220);
$this->Book->save($this->request->data, array('deep'=>TRUE));

还有保存调用:

  $this->Book->saveAll($this->request->data, array('deep'=>TRUE));

【问题讨论】:

你应该有Book hasMany Comment。您有Book HABTM 评论 您能否显示您尝试保存数据的代码以及您要保存的数组的结构? 我已经尝试了 saveAll、saveAssociated,但都没有成功。 只能确认AgRizzo所说的。使用 HABTM 完全是“错误的” 【参考方案1】:

我认为请求数据数组的格式不正确,以便 cakephp 正确保存。 你可以发布数组吗? 你可以在 save() 函数之前添加这一行:

pr($this->request->data);

查看此链接:Saving HABTM

【讨论】:

Array ( [Book] => Array ( [title] => title125 [author] => title625 ) [User] => Array ( [id] => 4 ) [Comment] => Array ( [body] => cm: 507 ) ) 我认为这里的问题是一个表中有多个索引键。 在我看来问题出在模型注释内部。我知道这是一个连接表,但主键必须是 comment_id 和 book_id,然后你将有另一个名为 user_id 的外键,它是用户的参考 id。如果我理解得很好,您不需要使用 HABTM 模型而是使用 Has Many Through 模型,因为您在模型中不仅有两个主键,而且还有用户的另一个信息。见参考:[链接] (book.cakephp.org/2.0/en/models/…) 感谢您指出这一点。我认为 HABTM 足以建立连接,但正确的答案是 HMT,我的数据格式不正确,而我试图将其保存到数据库中。所以我投票给你的第一个答案。干杯

以上是关于cakephp 中的正确模型关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP - 如何在保存时将关联记录添加到模型中?

如何使用 cakephp 3 在不同数据库中的模型之间进行关联?

Cakephp 3 保存关联属于ToMany

CakePHP 模型关联深层模型包含

CakePHP 3:保存关联模型失败

CakePHP 多模型关联