我正在使用Symfony 2构建一个REST API,我遇到了一个非常罕见的问题......我在OneToMany中有一个“客户”表和另一个“控制”表,如果我试图得到一个在“控制”表中使用值的客户我得到的是JSON格式的所有数据库信息......:S
例如:id = 12的客户没有在“control”表中关联的数据,所以如果我这样做 http://localhost/Ourentec/web/app_dev.php/api/v1/customers/12 我得到了正确的JSON
[[${foo}]]
但如果我对id = 11做同样的事情(带有“控件”和“历史记录”的客户就是我获取所有数据库信息的时候!!!
任何想法?在此先感谢:)
编辑:
以下是我的一个或所有客户的API控制器:
{
"customer": {
"id": 12,
"name": "Zampacontos",
"lastname": "",
"address": "",
"phone": "000000000",
"pass": "no tiene",
"tasks": "Portátil Toshiba con cargador y funda negra \"tec air\".\r\n Cambiar pila BIOS y comprobar que no de errores (optimizar) Urgente ",
"status": "Terminado",
"email": "",
"date": "2015-11-06T13:06:00+0100",
"location": "Tienda",
"is_active": 0,
"controls": [],
"histories": []
}
}
如果我做http://localhost/Ourentec/web/app_dev.php/api/v1/customers/,我也会收到所有数据库信息。甚至“用户”表当然还包括我的所有用户,密码(加密)等......:O
答案 0 :(得分:0)
这是因为find
和findAll
方法的行为不同。
在幕后,findAll
使用了预先加载,但find
是懒惰的。
所以findAll将从所有相关的entites中获取数据。
Find只会获取关系ID,将代理对象放在关系字段中。
如果您想拥有完整控件,只需使用查询构建器在实体存储库中实现findAll方法。
答案 1 :(得分:0)
好吧,所以我决定只从我的客户那里得到一些有趣的字段。
型号:
public function getCustomerForApi($customerId)
{
$customer = $this->em
->createQuery('select c.name, c.lastname, c.address, c.phone, c.pass, c.tasks, c.email, c.status, c.location
from OurentecBundle:Customer c where c.id = :id')
->setParameter('id', $customerId)
->getResult();
return $customer;
}
和控制器:
/**
* @return array
* @Rest\Get("/customers/{id}")
* @Rest\View
*/
public function getCustomerAction(Request $request)
{
$customerModel = $this->get('ourentec.customer_model');
$customer = $customerModel->getCustomerForApi($request->get('id'));
return array('customer' => $customer);
}
这不是我想要的,但它可以很好地进行测试:)
再次感谢Mateusz !!
答案 2 :(得分:0)
为什么不使用:
$ customer = $ this-> getDoctrine() - > getRepository('OurentecBundle:Customer') - > findOneById($ id);