[英]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.