2012-12-13 88 views
2

我正在使用php.activerecord,我試圖鏈接兩個表。與自定義表和鍵名稱的模型關聯

我有contactscontactCompanyLinks。每個聯繫人可以在鏈接表中包含一個或多個行。表中的字段名稱不遵循任何明智的約定,但我無法更改它,因爲它會使用同一個表破壞另一個應用程序。

contacts的主鍵被稱爲contactID,而contactCompanyLinks中的外鍵被稱爲inspectorID

php.activerecord造成太多假設,我無法弄清楚如何讓它將我的表連接在一起。

這裏是我的模型:

Contact.php

<?php 
class Contact extends ActiveRecord\Model { 
    static $primary_key = 'contactID'; 

    static $has_many = array(
     array(
      'contactCompanyLinks', 
      'class_name' => 'ContactCompanyLink', 
      'foreign_key' => 'inspectorID' 
     ) 
    ); 
} 

ContactCompanyLink.php

<?php 
class ContactCompanyLink extends ActiveRecord\Model { 
    static $table_name = 'contactCompanyLinks'; 

    static $belongs_to = array(
     array('contact') 
    ); 
} 

這看起來正確的,但是當我試圖讓一排,它不工作。我做了以下:

<?php 
var_dump(Contact::find(1234)->contactcompanylinks); 

我打印到屏幕上的所有是NULL!如果我嘗試其他屬性,如contactcompanylinkContactCompanyLinkContactCompanyLinks,我收到了「未定義的屬性」錯誤。

var_dump(Contact::find(1234)工作得很好。它向我展示了contacts表中的字段。

如何告訴php.activerecord在我試圖告訴它如何將兩個表連接在一起時停止假設並聽取我的意見?

+0

你說的是'var_dump''find'的結果,它工作得很好。將結果存儲在變量中並運行「contactcompanylinks」函數後會發生什麼?我認爲沒有什麼會因爲PHP的工作原理而改變,但我遇到了怪異的東西。 – Jelmer

+0

@Jelmer:這是一個很好的想法,但它不會改變任何事情。而且''find'本身工作正常,但只返回來自'contacts'的行。 –

+0

當你擴展你定義的'belongs_to'與模型的foreign_key綁定的數組時會發生什麼?我從來沒有使用ActiveRecord,但我知道在CakePHP中可以定義'foreign_key'。它看起來像相同的結構。你嘗試過嗎?在這裏我看到他們做了這樣的事情。 http://www.phpactiverecord.org/docs/ActiveRecord/Model – Jelmer

回答

2

未定義的屬性錯誤可能來自您的IDphpactiverecord假設,不然FORCES所有屬性都是小寫。

這意味着所有字段應該被稱爲小寫字母。 E.G.,你的鑰匙應該是inspectoridcontactid

這不是隻有列的情況。類名(php類)顯然應該是它們實際的情況,並且表名也是如此。

我總是明確定義連接的所有元素以避免這種假設問題。這意味着兩個連接將所有的元素對我來說:

static $belongs_to = array(
    array('somename', 
     'foreign_key'=>'someid', 
     'primary_key'=>'id', 
     'class_name'=>'Models\\NameSpace\\YourModelClassName') 
); 

而且還需要爲has_many相同的字段。 belongs_to中的主鍵是OTHER表的ID,外鍵是此表中的鍵(當我說鍵時,我的意思是列名)。對於屬於外鍵的鍵是在其他表中的鍵和主鍵中的鍵。

另外,請注意命名空間的雙斜線。

+0

'表中的字段名稱不遵循任何明智的約定,但是我無法更改它,因爲它會使用同一張表破壞另一個應用程序。「所以你所說的是:他必須改變它?沒有這樣的方法,只需在綁定數組中設置鍵即可「覆蓋」它? – Jelmer

+1

不!你在哪裏閱讀? :D我在說你應該在建立連接的數組中定義它們,因爲它們不同於假定的:)。在代碼中的所有調用定義中,都應該使它們爲小寫:這並不重要,因爲SQL對列不區分大小寫,這種方式不需要對字段名進行更改。 – Nanne

+0

這是來自Rocket的開場白帖子,而不是你的迴應:)但沒關係,現在我明白了。 Tnx :) – Jelmer