在检索数据(belongsToMany关系)时,“无法将值转换为字符串”。

8
我正在使用CakePHP 3.3.6和MySQL 5.7.13。
我的数据库中有这三个表(以及其他表):collections,tags和连接表collections_tags。
收藏表。
CREATE TABLE IF NOT EXISTS `database`.`collections` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `event_date` DATE NOT NULL,
  `url_slug` VARCHAR(45) NOT NULL,
  `status` TINYINT(1) NOT NULL DEFAULT 0,
  `user_id` INT UNSIGNED NOT NULL,
  `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`, `user_id`),
  INDEX `fk_collections_users1_idx` (`user_id` ASC),
  CONSTRAINT `fk_collections_users1`
    FOREIGN KEY (`user_id`)
    REFERENCES `database`.`users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
ENGINE = InnoDB

标签表格

CREATE TABLE IF NOT EXISTS `database`.`tags` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`))
ENGINE = InnoDB

collections_tags 表

CREATE TABLE IF NOT EXISTS `database`.`collections_tags` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `collection_id` INT UNSIGNED NOT NULL,
  `tag_id` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`, `collection_id`, `tag_id`),
  INDEX `fk_collections_has_tags_tags1_idx` (`tag_id` ASC),
  INDEX `fk_collections_has_tags_collections1_idx` (`collection_id` ASC),
  CONSTRAINT `fk_collections_has_tags_collections1`
    FOREIGN KEY (`collection_id`)
    REFERENCES `database`.`collections` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_collections_has_tags_tags1`
    FOREIGN KEY (`tag_id`)
    REFERENCES `database`.`tags` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

在我的Table\CollectionsTable.php文件中:
public function initialize(array $config)
{
    # A collection hasMany Sets
    $this->hasMany('Sets', [
        'dependent' => True,
    ]);

    # A Collection belongsTo a User
    $this->belongsTo('Users');

    # A Collection belongsToMany Tags
    $this->belongsToMany('Tags');
}

在我的Table\TagsTable.php文件中:
public function initialize(array $config)
{
    # A Tag belongsToMany Collections
    $this->belongsToMany('Collections');
}

我可以获取所有的收藏夹或标签,这个没问题。 但是如果我尝试获取所有带有它们关联标签的收藏夹,我会遇到这个错误:

Cannot convert value to string

这个错误发生在我的 Collections 控制器中有以下代码时:
class CollectionsController extends AppController
{
    public function index()
    {
        $this->set('collections', $this->Collections->find('all', ['contain' => ['Tags']]));
    }
}

而这是我在模版\Collections\index.ctp中的代码:

<h1>Hi, this is the Collection > Index page.</h1>

<?php foreach ($collections as $collection): ?>
<p>test</p>
<?php endforeach; ?>

我不知道为什么...我尝试创建一个Table\CollectionsTagsTable.php文件,但没有任何变化。
谢谢你的帮助。
编辑:我尝试将DATETIME字段更改为TIMESTAMP,并将TINYINT更改为INT,但没有任何变化。

每当收到错误时,请始终发布“完整”的错误消息,即包括“完整的”堆栈跟踪(最好从日志中复制,以便以适当的可读格式提供),即使问题可能对熟悉CakePHP的人来说是显而易见的! - ndm
请提供生成错误的SQL。 - Rick James
3
如果id是自增的,那么使用PRIMARY KEY (id, ...)几乎总是“错误”的。 - Rick James
这里有一些关于更高性能的多对多表结构的提示:Here - Rick James
4个回答

8

我使用类似的设置在本地进行了测试。看起来你在collections表中的主键索引"user_id"导致了这个问题。通过删除它,问题得以解决。

实际上,我对复合键及其在CakePHP3中的使用并没有太多了解,也许有更多经验的人能够告诉为什么会出现这种情况。


嗨!确实,删除主键解决了问题。一切都按预期工作。谢谢!不过我想知道它到底改变了什么:将字段设置为主键和不设置为主键之间有什么区别? - William Gérald Blondel

2

尝试将集合的复合主键更改为仅使用id字段。


嗨!事实上,移除主键解决了问题。一切都按预期工作。谢谢!不过我想知道它到底改变了什么:将字段设置为主键和不设置为主键有什么区别? - William Gérald Blondel
我不是很确定,但怀疑该框架将复合键作为字符串处理,但在PHP端仍将单个主键保留为整数。而且在PHP的某个地方,这个字符串会成为问题所在。 - Sergiy Tytarenko

2
您在 CollectionsTable 类中没有将主键设置为 iduser_id 的组合。
// In initialize method of CollectionsTable
$this->primaryKey(['id', 'user_id']);

谢谢,这个解决方案也行。但是我不需要一个复合主键,所以我只删除了 user_id 主键(而不是字段),现在它可以工作了。因为你,我现在知道如何在 CakePHP 中设置一个复合主键 :) - William Gérald Blondel
没问题,我认为Cake可以很好地处理复合键! - cjquinn

0

我有同样的问题。从Inzamam Malik的评论中找到了解决方案。用户表缺少身份列并且具有重复的身份值,导致返回数组。清除重复记录并设置身份和主键,问题得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接