2013-06-04 27 views
1

目標:
我的目標是能夠調用$entity->legalName()->first()並獲得實體的法定名稱。Laravel 3:沒法把我的頭周圍的`HAS_ONE包裹()`關係


型號:

##### Entity ##### 
namespace Entity\Eloquent; 
class Entity extends \Eloquent{ 

    public static $key = 'uuid'; 

    public function names(){ 
     return $this->has_many(
       'Entity\Eloquent\EntityName', 
       'entity_uuid' 
      ); 
    } 

    public function legalName(){ 
     return $this->has_one(
       'Entity\Eloquent\EntityName', 
       'entity_name_id_legal_name' 
      ); 
    } 
} 

##### EntityName ##### 
namespace Entity\Eloquent; 
class EntityName extends \Eloquent{ 

    /** 
     * NOTE: I've tried a few things, but 
     *   currently, this model is empty. 
     */
} 


嘗試:

$entity = Entity::find($uuid); 
$legalName = $entity->legalName()->get(); 
echo '<pre>LegalName:<br />',var_dump($legalName),'</pre>'; 

########################################### 
## ERROR: 
## Column not found: 1054 Unknown column 'entity_name_id_legal_name' in 'where clause' 
## SQL: SELECT * FROM `m3sandbox_company_name` WHERE `company_name_id_legal_name` = ? 
## Bindings: array (0 => 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14') 
########################################### 


還試圖:
我還試圖改變Entity->legalName()關係方法:

public function legalName(){ 
    return $this->has_one 
     (
      'Entity\Eloquent\EntityName', 
      'id' 
     ); 
} 

雖然結果不同,他們仍然不正確的:

$entity = Entity::find($uuid); 
$legalName = $entity->legalName()->get(); 
echo '<pre>LegalName:<br />',var_dump($legalName),'</pre>'; 

########################################### 
## prints: null 
########################################### 


數據說明:
一個實體可以有N個名字,所以entity.uuid(一)和entity_name.entity_uuid(很多)之間有一對多的關係。
但實體只能有一個合法的名稱,因此entity.entity_name_id_legal_nameentity_name.id之間存在一對一的關係。

數據:

INSERT INTO `entity` 
(`uuid`, `entity_name_id_legal_name`, `datetime_created`) 
VALUES 
('a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 39657, '2011-06-29 02:12:06'); 

INSERT INTO `entity_name` 
(`id`, `entity_uuid`, `value`, `datetime_created`) 
VALUES 
(516, 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 'Bingo', '2011-06-29 02:12:06'), 
(3965, 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 'Bango', '2013-05-17 00:00:00'), 
(39657, 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 'Bongo', '2013-05-17 00:00:00'); 


摘要:
我需要得到實體有一-legalName關係運作。

我錯過了什麼?
我哪裏錯了?

+0

您是否爲「Entity \ Eloquent \ EntityName」創建了擴展Eloquent的模型? –

回答

0

問題是,在關係方法中,has_one()的第二個參數需要取相關表中外鍵列的名稱。

我希望更多的東西一樣:

public function legalName(){ 
    return $this->has_one(
      'Entity\Eloquent\EntityName', 
      'entity_id' // Name of column in the entity_names table 
     ); 
} 

在包含實體,該實體名稱的ID,你應該有一列名爲「ENTITY_ID」或類似的entity_names表。

簡而言之,您傳遞的是「實體」表中的列名,您應該傳遞entity_names表中使用的列名。

如果您想讓您的表保持現狀(名稱表的外鍵存儲在實體表中),您應該使用belongs_to關係。

public function legalName(){ 
     return $this->belongs_to(
       'Entity\Eloquent\EntityName', 
       'entity_name_id_legal_name' // Name of column in the entities table 
      ); 
    } 

與「belongs_to的」總是包含在它的表的外鍵的對象,並以「HAS_ONE」的對象永遠不會包含外鍵在它的表。

+0

謝謝......特別是最後一行。 1)所有'has_xxx()'關係指定在相關表中找到的FK字段名,2)所有'belongs_to()'關係指定表中使用的FK字段名模型調用關係3)因此,'has_many_and_belongs_to()'關係指定在其自己的表中使用的field_name和在相關表中找到的field_name。我切換到'belongs_to()',它運行得非常漂亮。謝謝 – mOrloff