我正在为一个在前端使用SproutCore的项目开发一个REST风格的应用程序。
我的问题是,当需要返回JSON时,从一个包含其他相关模型的模型中获取数据的最有效方法是什么?我昨天读到,建议在使用数组时使用DAO层,所以对于我的示例,这就是我目前所拥有的。
我有一个客户列表,其中每个客户都有_MANY品牌,每个品牌都有_MANY项目。我没有得到一个很好的客户阵列和他们的品牌。下面是我得到的:
$clients = Yii::app()->db->createCommand('select client.* from client where client.status = 1')->queryAll();
foreach($clients as $ckey => $client)
{
$clients[$ckey] = $client;
$brand_ids = Yii::app()->db->createCommand('select brand.id as brand_id, brand.client_id as b_client_id from brand where brand.client_id ='.$client['id'])->queryAll();
foreach($brand_ids as $bkey => $brand_id)
{
$clients[$ckey]['brands'][] = $brand_id['brand_id'];
}
}
这是我目前想要的回报,但这是实现我所追求的最有效的方式吗?
3条答案
按热度按时间nzrxty8p1#
设置客户端模型
设置品牌型号
在您的行动功能中进行客户/品牌搜索
这是你想要的吗?我意识到,如果你只想选择品牌ID(没有更多的数据),你可以通过SQL和GROUP_CONCAT(MySQL)搜索,并选择所有的品牌ID为客户端在一行中用逗号分隔。
1,2,3,4,5,20,45,102
。d7v8vwbk2#
如果您不想使用CActiveRecord的
with()
功能,那么您应该编写一个SQL查询来连接brand
表。这比执行一个查询来检索所有客户,然后执行N个查询来获取其品牌(其中N是客户的数量)要高效得多。您还可以连接第三个表
projects
,并检索每个品牌的所有相关项目。3zwjbxry3#
我知道这是旧的,但我一直在寻找一个解决方案,我自己,我认为这是一个很好的。
在我的基本控制器类(protected/Components/Controller.php)中,我添加了以下函数:
现在,在一个对象或对象数组上调用renderJsonDeep,将对JSON中的对象进行编码,包括您拉取的任何关系,就像将它们添加到DbCriteria中的'with'参数一样。
如果子对象有任何关系,也会在JSON中设置这些关系,因为getAttributesDeep是递归调用的。
希望这能帮助到一些人。