簡體   English   中英

在Lithium中訪問多個模型深層關系

[英]Accessing more than one model deep relationships in 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'))但是我想讓每個City都返回它的State模型,所以我可以像這樣訪問它:

$user->city->state->field

現在我只能讓它深入( $user->city )並且我必須再次重新查詢,這似乎效率低下。

使用最近的master,您可以使用以下嵌套表示法:

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

它會為你做JOIN。

我猜你在使用SQL?

Lithium主要是為noSQL db而設計的,因此遞歸/多連接不是設計目標。

  • 您可以設置本機sql連接查詢並將其強制轉換為模型。
  • 使用Users和State查詢城市作為連接。
  • 您可以設置基於數據庫的連接視圖,li3將其用作單獨的模型。
  • 您可能應該將計划的遞歸調用拆分為多個數據庫請求。

想想n個城市對m個國家的商數。 =>使用city獲取用戶,然后按州id獲取狀態。 =>將其作為兩個鍵傳遞或嵌入狀態信息。 這對於Users :: all()查詢也是可以接受的。

使用Lithiums util \\ Set類的示例:

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
    ),
));

您可以通過這種方式設置關系,但必須使用更詳細的關系定義。 查看構建關系時傳遞的數據,以獲取有關可以使用的選項的詳細信息。

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
    );
}

在用戶上使用States關系時,請務必始終在同一查詢中包含Cities關系。 例如:

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

我從來沒有嘗試過使用belongsTo關系,但我讓它以同樣的方式使用hasMany關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM