"Cannot convert value to string" 检索数据时(belongsToMany 关系)
"Cannot convert value to string" when retrieving data (belongsToMany relationship)
我正在使用 CakePHP 3.3.6 和 MySQL 5.7.13。
我的数据库中有这三个 table(除其他外):collections、tags和加入 table collections_tags.
collections Table
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
标签Table
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 Table
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');
}
我可以获得所有 Collections 或所有标签。有用。
但是,如果我尝试获取所有 Collections 及其相关标签,则会出现此错误:
当我的 Collections 控制器中有这个时,会发生此错误:
class CollectionsController extends AppController
{
public function index()
{
$this->set('collections', $this->Collections->find('all', ['contain' => ['Tags']]));
}
}
这在我的 Template\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 文件,但没有任何效果。
感谢您的帮助
EDIT :我尝试通过 TIMESTAMP 和 TINYINT 通过 INT,它没有改变任何东西。
使用类似的设置在本地进行了测试。似乎您在集合 table 中的主键索引 "user_id"
导致了这里的问题。删除它,问题就消失了。
我实际上对复合键及其在 CakePHP3 中的用法知之甚少,所以也许有更多经验的人可以告诉我为什么会失败。
尝试将集合上的复合主键更改为仅 id 字段。
您还没有在 CollectionsTable
class.
中将主键设置为 id
和 user_id
的组合
// In initialize method of CollectionsTable
$this->primaryKey(['id', 'user_id']);
我正在使用 CakePHP 3.3.6 和 MySQL 5.7.13。
我的数据库中有这三个 table(除其他外):collections、tags和加入 table collections_tags.
collections Table
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
标签Table
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 Table
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');
}
我可以获得所有 Collections 或所有标签。有用。 但是,如果我尝试获取所有 Collections 及其相关标签,则会出现此错误:
当我的 Collections 控制器中有这个时,会发生此错误:
class CollectionsController extends AppController
{
public function index()
{
$this->set('collections', $this->Collections->find('all', ['contain' => ['Tags']]));
}
}
这在我的 Template\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 文件,但没有任何效果。
感谢您的帮助
EDIT :我尝试通过 TIMESTAMP 和 TINYINT 通过 INT,它没有改变任何东西。
使用类似的设置在本地进行了测试。似乎您在集合 table 中的主键索引 "user_id"
导致了这里的问题。删除它,问题就消失了。
我实际上对复合键及其在 CakePHP3 中的用法知之甚少,所以也许有更多经验的人可以告诉我为什么会失败。
尝试将集合上的复合主键更改为仅 id 字段。
您还没有在 CollectionsTable
class.
id
和 user_id
的组合
// In initialize method of CollectionsTable
$this->primaryKey(['id', 'user_id']);