2014-06-29 71 views
0

出於某種原因Datamapper無法識別我的表內外鍵關係,並且在嘗試訪問我的相關對象時嘗試使用連接表。Codeigniter Datamapper ORM - 表中的外鍵不起作用

這可能是你可以得到這種關係的最簡單的例子。這裏是我的代碼如下所示:

class Venue extends DataMapper 
{ 
    public $has_one = ['town']; 
} 

class Town extends DataMapper 
{ 
    public $has_many =['venue']; 
} 

// Controller 
class Pubs extends CI_Controller 
{ 
    public function single($id) { 
     $v = new Venue($id); 
     $v->town->get(); 
     echo $v->town->name; 
    } 
} 

下面是MySQL的創建代碼爲我的場館表:

CREATE TABLE `venues` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(45) NULL DEFAULT NULL, 
    `town_id` INT(10) UNSIGNED NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `town_venue` (`town_id`), 
    CONSTRAINT `FK1_towns` FOREIGN KEY (`town_id`) REFERENCES `towns` (`id`) 
) 

這裏的城鎮表:

CREATE TABLE `towns` (
    `id` INT(10) UNSIGNED NOT NULL, 
    `name` VARCHAR(45) NULL DEFAULT NULL, 
    `country` INT(11) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

當我運行的方法在控制器中,我得到一個codeigniter DB錯誤,指出「Table'mydatabase.towns_venues'不存在」。

很明顯datamapper並沒有意識到它可以使用一個表內的外鍵,並正在尋找一個連接表。任何人都可以提出這是爲什麼發生?我拉我的頭髮試圖找出什麼地方錯了我的設置

+0

裏面添加messinng的時候,我試圖通過代碼加強的負載後,就會像我的問題是因爲代碼不正確地從數據庫初始化模型中的字段列表。這個問題似乎是CodeIgniter的「field_data()」函數,它返回一個空的數組,而不是返回一個數組的字段.... – JMac

+0

好幾個小時後頭撓我想我已經解決了這個問題。如果有其他人遇到相同情況,我會在此發佈我的發現。 似乎最新版本的datamapper依賴於codeigniter的CI_DB_mysql_result :: field_data()方法,它在版本2.2.0(最新正式版本,但它在最新的開發版本中已修復)中似乎完全破壞。 所以,據我所見,最新版本的datamapper無法正常使用最新的官方版本codeigniter! – JMac

回答

0

嘗試以下操作:

  1. 在你的模型明確添加外鍵
  2. 嘗試從表中刪除外鍵和看看它是否有效。

第1步這裏就是你可以在你的模型

var $has_one = array(
    'CLASS' => array(
     'join_other_as' => 'RELATIONSHIP_TABLE_NAME', 
     'join_self_as' => 'SELF_TABLE_NAME' 
    ) 
); 

Reference

+0

我使用php 5.4中引入的短陣列符號:-) – JMac

+0

哦,廢話!抱歉。更新我的回答 – Sobiaholic

+0

我已經改變了模型類來手動指定關係,並且它沒有效果。還是一樣的錯誤。我也刪除了數據庫中的外鍵關係,它也沒有什麼區別 – JMac