访问不止一个模型在锂的深度关系


Accessing more than one model deep relationships in 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),我必须再次询问,这似乎效率很低。

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

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

它将为您执行JOIN。

我猜您在使用SQL?

锂主要是为noSQL数据库设计的,因此递归性/多连接不是设计目标。

  • 您可以设置一个本机sql联接查询,并将其强制转换到模型上
  • 以Users和State作为联接查询城市
  • 您可以设置一个基于数据库的联接视图,li3将其作为一个单独的模型使用
  • 您可能应该将计划中的递归调用拆分为多个db请求

想想n个城市与m个州的商。=>获取带有city的用户,然后通过state id获取state。=>将其作为两个键传递或嵌入state信息。这对于用户::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关系。