4

是否可以在 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),我不得不再次重新查询,这似乎效率低下。

4

3 回答 3

9

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

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

它会为你做 JOIN。

于 2013-02-20T16:05:31.383 回答
3

我猜你正在使用SQL?

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

  • 您可以设置本机 sql 连接查询并将其投射到模型上。
  • 使用用户和状​​态作为连接查询城市。
  • 您可以设置一个基于数据库的连接视图,并且 li3 将其用作单独的模型。
  • 您可能应该将计划的递归调用拆分为多个数据库请求。

考虑 n 个城市与 m 个州的商。=> 使用城市获取用户,然后通过状态 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
    ),
));
于 2012-03-23T13:18:04.650 回答
2

您可以通过这种方式建立关系,但您必须使用更详细的关系定义。查看构建关系时传递的数据,了解有关您可以使用的选项的详细信息。

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 关系以同样的方式工作。

于 2012-06-09T15:33:28.577 回答