2012-03-23 63 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