2013-09-23 21 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(...)))