2016-10-18 20 views
7

Tôi đang sử dụng CakePHP 3.3.6 và MySQL 5.7.13."Không thể chuyển đổi giá trị thành chuỗi" khi truy xuất dữ liệu (mối quan hệ thuộc vềToMany)

Tôi có ba bảng trong cơ sở dữ liệu của tôi (giữa những người khác): bộ sưu tập, thẻ và tham gia bảng collections_tags.

bộ sưu tập Bảng

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 

thẻ Bảng

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 Bảng

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 

trong tôi Bảng \ 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'); 
} 

trong bảng của tôi \ TagsTable.php:

public function initialize(array $config) 
{ 
    # A Tag belongsToMany Collections 
    $this->belongsToMany('Collections'); 
} 

tôi có thể nhận được tất cả các bộ sưu tập hoặc tất cả các Tags. Nó hoạt động. Nhưng nếu tôi cố gắng để có được tất cả các bộ sưu tập với các thẻ có liên quan của họ, tôi có lỗi này:

Cannot convert value to string

Lỗi này xảy ra khi tôi có điều này trong bộ sưu tập điều khiển của tôi:

class CollectionsController extends AppController 
{ 
    public function index() 
    { 
     $this->set('collections', $this->Collections->find('all', ['contain' => ['Tags']])); 
    } 
} 

và điều này trong tôi Template \ Bộ sưu tập \ index.ctp:

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

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

tôi không có ý tưởng tại sao ... Tôi đã cố gắng tạo ra một tập tin Table \ CollectionsTagsTable.php, nhưng nó đã không tạo sự khác biệt.

Nhờ sự giúp đỡ của bạn

EDIT: Tôi cố gắng thay đổi DATETIME lĩnh vực bởi dấu thời gianTINYINT bởi INT, nó đã không thay đổi bất cứ điều gì.

+0

Bất cứ khi nào gặp lỗi, hãy luôn gửi thông báo lỗi _complete_, nghĩa là bao gồm cả stacktrace _full_ (lý tưởng sao chép từ các bản ghi mà nó có sẵn trong một thời trang đúng cách có thể đọc được), ngay cả khi vấn đề có thể là hiển nhiên đối với những người quen thuộc với CakePHP! – ndm

+0

Và cung cấp SQL đã tạo ra lỗi. –

+3

Nó hầu như luôn luôn "sai" để có 'PRIMARY KEY (id, ...)' khi id là 'AUTO_INCREMENT'. –

Trả lời

6

Đã thử nghiệm cục bộ với thiết lập tương tự. Có vẻ như chỉ mục khóa chính của bạn "user_id" trong bảng bộ sưu tập gây ra sự cố ở đây. Bằng cách loại bỏ nó, vấn đề đã biến mất.

Tôi thực sự không có nhiều kiến ​​thức về các phím tổng hợp và cách sử dụng chúng trong CakePHP3, vì vậy có thể ai đó có nhiều kinh nghiệm có thể biết được, tại sao điều này không thành công.

+0

Xin chào! Thật vậy, việc loại bỏ khóa chính sẽ giải quyết được vấn đề. Và mọi thứ đều hoạt động như mong đợi. Cảm ơn! Tuy nhiên tôi muốn biết những gì nó thay đổi thực sự: sự khác biệt giữa thiết lập các lĩnh vực như là tiểu học và không đặt nó là chính? –

2

Cố gắng thay đổi khóa tổng hợp chính của bạn trên bộ sưu tập thành chỉ trường id.

+0

Xin chào! Thật vậy, việc loại bỏ khóa chính sẽ giải quyết được vấn đề. Và mọi thứ đều hoạt động như mong đợi. Cảm ơn! Tuy nhiên tôi muốn biết những gì nó thay đổi thực sự: sự khác biệt giữa thiết lập các lĩnh vực như là tiểu học và không đặt nó là chính? –

+0

Tôi biết một cách trung thực, nhưng nghi ngờ khung làm cho khóa tổng hợp một chuỗi, nhưng giữ một khóa chính một số nguyên ở phía bên php. Và một nơi nào đó trên PHP mà chuỗi được trong cách. –

1

Bạn chưa đặt khóa chính làm tổ hợp của iduser_id trong lớp CollectionsTable của bạn.

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

Cảm ơn, giải pháp này cũng làm việc. Nhưng như tôi không cần một khóa chính composite, tôi chỉ cần xóa user_id khóa chính (không phải là lĩnh vực) và nó hoạt động. Nhờ bạn, tôi biết cách đặt khóa chính kết hợp trong CakePHP :) –

+0

Không vấn đề gì, Bánh xử lý các phím tổng hợp khá độc đáo mà tôi nghĩ! – cjquinn

Các vấn đề liên quan