[英]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而設計的,因此遞歸/多連接不是設計目標。
想想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.