& quot; Невозможно преобразовать значение в строку & quot; при получении данных (отношение принадлежит ToMany)

Я использую CakePHP 3.3.6 и MySQL 5.7.13.

У меня есть эти три таблицы в моей базе данных (среди прочих): коллекции, теги и стол соединения 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

Стол коллекций

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

в моей таблице \ 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');
}

в моей таблице \ TagsTable.php:

public function initialize(array $config)
{
# A Tag belongsToMany Collections
$this->belongsToMany('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, это ничего не изменило.

7

Решение

Протестировал его локально с аналогичной настройкой. Похоже, ваш индекс первичного ключа "user_id" В таблице коллекций возникает проблема здесь. Удаляя его, проблема исчезла.

На самом деле я не очень разбираюсь в составных ключах и их использовании в CakePHP3, так что, возможно, кто-то с большим опытом сможет сказать, почему это не удается.

6

Другие решения

Попробуйте изменить составной первичный ключ в коллекциях на поле id.

2

Вы не установили первичный ключ как составной id а также user_id в вашем CollectionsTable учебный класс.

// In initialize method of CollectionsTable
$this->primaryKey(['id', 'user_id']);
1