为什么我在mi Symfony 2 REST API中获取某些值的所有数据库信息?

时间:2015-11-25 20:28:36

标签: json api rest symfony doctrine

我正在使用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

3 个答案:

答案 0 :(得分:0)

这是因为findfindAll方法的行为不同。

在幕后,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);