2012-03-28 154 views
0

首先亮相,遺憾的代碼的大型發佈,但...嵌套關係

我有以下DB結構(不是我的選擇):

+---------+ +--------------+ +--------+ 
| users | | users_groups | | groups | 
+---------+ +--------------+ +--------+ 
| id | | user_id | | id | 
| name | | group_id | | name | 
+---------+ +--------------+ +--------+ 

我已經創建了FuelPHP的ORM的關係:

class Model_User extends Orm\Model 
{ 
    protected static $_properties = array(
     'id', 
     'name', 
    ); 

    protected static $_has_many = array('usergroup'); 
} 

class Model_Usergroup extends Orm\Model 
{ 
    protected static $_table_name = 'users_groups'; 

    protected static $_properties = array(
     'user_id', 
     'group_id', 
    ); 

    protected static $_belongs_to = array('user', 'group'); 
} 

class Model_Group extends Orm\Model 
{ 
    protected static $_properties = array(
     'id', 
     'name', 
    ); 

    protected static $_has_many = array('usergroup'); 
} 

現在我試圖讓一個查詢中使用顯示從3個表中的所有數據如下:

$data['users'] = Model_User::find() 
    ->related('usergroup') 
    ->related('usergroup.group') 
    ->get(); 

它返回這樣的:

Array 
(
    [1] => Model_User Object 
     (
      [_is_new:Orm\Model:private] => 
      [_frozen:Orm\Model:private] => 
      [_data:Orm\Model:private] => Array 
       (
        [id] => 1 
        [name] => somename 
       ) 

      [_original:Orm\Model:private] => Array 
       (
        [id] => 1 
        [name] => somename 
       ) 

      [_data_relations:Orm\Model:private] => Array 
       (
        [usergroup] => Array 
         (
         ) 

       ) 

      [_original_relations:Orm\Model:private] => Array 
       (
       ) 

      [_view:Orm\Model:private] => 
      [_iterable:protected] => Array 
       (
       ) 
     ) 
) 

所以它開始尋找users_groups而停止?我甚至以正確的方式解決這個問題?當然,我可以通過帶有連接的常規查詢來獲得此信息,但實際上知道如何使用ORM執行此操作會是高手。

回答

1

Gaaaak!它只是在users_groups表上缺少一個PK ...

class Model_Usergroup extends Orm\Model 
{ 
    protected static $_table_name = 'users_groups'; 
    protected static $_primary_key = array('pk_id'); 

    protected static $_properties = array(
     'pk_id', 
     'user_id', 
     'group_id', 
    ); 

    protected static $_belongs_to = array('user', 'group'); 
} 
1

這是一個多關係,檢查文檔以瞭解如何配置它。

你選擇的解決方案是唯一有用的,當你需要保存在users_groups表之間的關係的附加屬性。

+0

這是使用該結構的Sentry身份驗證軟件包,而您的ORM完全不喜歡它。只是增加一個特別命名的PK解決了所有問題。 – 2012-03-29 01:36:08

+0

ORM使用的所有表格都必須具有PK,並且不允許將FK用作PK。所以如果這是由Sentry定義的表格佈局,那麼他們做錯了(如:以非FuelPHP兼容的方式)。 – WanWizard 2013-01-27 01:00:16