2012-03-23 42 views
4

在Lithium中可以訪問多個深層關係模型嗎?在Lithium中訪問多個模型深層關係

例如,我有一個用戶模式:

class Users extends \lithium\data\Model { 
    public $validates = array(); 
    public $belongsTo = array("City"); 
} 

,我有一個城市模型:

class Cities extends \lithium\data\Model { 
    public $validates = array(); 
    public $belongsTo = array("State"); 
} 

和一個國家的模式,等等。

如果我正在查詢某個用戶,類似於Users::first(),是否有可能獲得結果中包含的所有關係?我知道我可以做Users::first(array('with' => 'City'))但我想有每個城市返回其國家的模式,也因此我可以這樣訪問:

$user->city->state->field 

現在,我只能讓它去一個深($user->city ),我不得不再次查詢,這似乎效率低下。

回答

3

我猜你正在使用SQL?

鋰主要是爲noSQL db's設計的,所以遞歸/多連接不是設計目標。

  • 您可以設置一個原生的sql連接查詢並將其轉換爲模型。
  • 以用戶和狀態作爲連接查詢城市。
  • 您可以設置基於數據庫的聯接視圖,而li3將其用作獨立模型。
  • 您可能應該將您計劃的遞歸調用拆分爲多個數據庫請求。

想想n個城市與m個州的商數。 =>用城市獲取用戶,然後用狀態ID獲取狀態。 =>將其作爲兩個鍵傳遞或嵌入狀態信息。這對Users :: all()查詢也是可以接受的。

例使用Lithiums UTIL \設置類別:

use \lithium\util\Set; 
$users = Users::all(..conditions..); 
$state_ids = array_flip(array_flip(Set::extract($users->data(), '/city/state_id'))); 
$stateList = States::find('list',array(
    'conditions' => array(
     'id' => $state_ids 
    ), 
)); 
2

您可以設置這樣的關係,但你必須使用一個更詳細的關係定義。查看構建Relationship時獲得的數據,以獲取有關可以使用的選項的詳細信息。

class Users extends \lithium\data\Model { 
    public $belongsTo = array(
     "Cities" => array(
      "to" => "app\models\Cities", 
      "key" => "city_id", 
     ), 
     "States" => array(
      "from" => "app\models\Cities", 
      "to" => "app\models\States", 
      "key" => array(
       "state_id" => "id", // field in "from" model => field in "to" model 
      ), 
     ), 
    ); 
} 

class Cities extends \lithium\data\Model { 
    public $belongsTo = array(
     "States" => array(
      "to" => "app\models\States", 
      "key" => "state_id", 
     ), 
    ); 
} 

class States extends \lithium\data\Model { 
    protected $_meta = array(
     'key' => 'id', // notice that this matches the value 
         // in the key in the Users.States relationship 
    ); 
} 

當在用戶上使用狀態關係時,一定要始終在同一個查詢中包含Cities關係。例如:

Users::all(array( 
    'with' => array(
     'Cities', 
     'States' 
    ) 
)); 

我從來沒有嘗試過這種使用屬於關聯關係,但我有它的工作以同樣的方式使用的hasMany關係。

9

使用最近的高手,你可以使用下面的嵌套註釋:

Users::all(array( 
    'with' => array(
     'Cities.States' 
    ) 
)); 

它會做的JOIN爲您服務。

+0

這非常有效! – 2013-03-02 22:01:02

+0

這個答案必須被接受,簡單而準確。 謝謝 – Crusader 2013-07-04 09:51:16