2013-09-23 29 views
0

簡單的多態關聯我有4款車型,ApplicationAccommodationInvoiceInvoiceItemMySQL錯誤與CakePHP的

InvoiceApplicationAccommodation所有的hasMany InvoiceItem

InvoiceItem屬於關聯ApplicationAccommodationInvoice

所有這些的目的都是爲了使的訂單項目成爲可能3210(其來自InvoiceItem模型)可與一個AccommodationApplication經由InvoiceItem.foreign_id取決於InvoiceItem.class是否被設置爲AccommodationApplication

從我明白,這被稱爲一個多態關聯相關聯。

不幸的是,當我做了$this->Invoice->find('all');遞歸設置爲3(或設置在中容納規定的相應字段爲-1)我得到這個MySQL錯誤:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'InvoiceItem.class' in 'where clause' 

SQL Query: SELECT `Application`.`id`, `Application`.`name`, 
`Application`.`created`, `Application`.`updated` FROM `applications` 
AS `Application` WHERE `Application`.`id` = 3786 AND 
`InvoiceItem`.`class` = 'Application' 

我不明白爲什麼蛋糕將嘗試添加InvoiceItem.class作爲條件,而不會創建InvoiceItem模型的連接。

這裏是我的模型(注意:我已經砍下場的數量爲每可讀性 - 在ApplicationAccommodation車型共享在現實中很少有類似領域):

住宿型號

CREATE TABLE `accommodations` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created` datetime NOT NULL, 
    `updated` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) 

<?php 
class Accommodation extends AppModel { 
    var $name = 'Accommodation'; 
    var $hasMany = array(
     'InvoiceItem' => array( 
      'className' => 'InvoiceItem', 
      'foreignKey' => 'foreign_id', 
      'conditions' => array('InvoiceItem.class' => 'Accommodation'), 
     ) 
    ); 
} 
?> 

應用模式

CREATE TABLE `applications` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created` datetime NOT NULL, 
    `updated` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) 

<?php 
class Application extends AppModel { 
    var $name = 'Application'; 
    var $hasMany = array(
     'InvoiceItem' => array( 
      'className' => 'InvoiceItem', 
      'foreignKey' => 'foreign_id', 
      'conditions' => array('InvoiceItem.class' => 'Application'), 
     ) 
    ); 
} 
?> 

InvoiceItem模式

CREATE TABLE IF NOT EXISTS `invoice_items` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `class` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `foreign_id` int(10) unsigned NOT NULL, 
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

<?php 
class InvoiceItem extends AppModel { 
    var $name = 'InvoiceItem'; 
    var $belongsTo = array(
     'Accommodation' => array(
      'foreignKey' => 'foreign_id', 
      'conditions' => array('InvoiceItem.class' => 'Accommodation') 
     ), 
     'Application' => array(
      'foreignKey' => 'foreign_id', 
      'conditions' => array('InvoiceItem.class' => 'Application') 
     ), 
     'Invoice' => array(
      'className' => 'Invoice', 
      'foreignKey' => 'invoice_id', 
     ), 
    ); 
} 
?> 

發票模型

CREATE TABLE IF NOT EXISTS `invoices` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

<?php 
class Invoice extends AppModel { 
    var $name = 'Invoice'; 
    var $hasMany = array(
     'InvoiceItem' => array(
      'className' => 'InvoiceItem' 
      'foreignKey' => 'invoice_id' 
     ) 
    ); 
} 
?> 

我使用CakePHP 2.4.0

回答

0

類InvoiceItem擴展AppModel,並綁定沒有屬於關聯。

class InvoiceItem extends AppModel { 
    var $name = 'InvoiceItem'; 
    var $belongsTo = null 
} 

您可以指定一個合適的屬於關聯在運行時InvoiceItem取決於內容

$this->InvoiceItem->bindModel(array('belongsTo' => array(...)))