在find方法中使用嵌套数组

时间:2013-10-21 21:57:48

标签: cakephp

我正在尝试根据我从另一个发现中收到的数组找到一种在cakePHP中进行查找的方法。

结构:我的数据库中有很多站点。我也有很多业务。每个企业都有一个网站,但并非所有网站都属于某个企业。我正在尝试获取销售中所有订单的列表,这些订单会转到属于某个企业的网站。我已经完成了一个find方法来获取属于某个业务的所有站点,这些站点以嵌套数组($ BUSINESS)返回,如下所示:

array(
(int) 0 => array(
    'Business' => array(
        'id' => '17',
        'name' => 'Name',
        'code' => 'Code',
        'discount' => 'Discount',
        'site_id' => 47
    )
),
(int) 1 => array(
    'Business' => array(
        'id' => '19',
        'name' => 'Name',
        'code' => 'Code',
        'discount' => 'Discount',
        'site_id' => '108'
    )
),

现在,我想将此数组中的数据用作另一个find方法的一部分。像这样:

$this->Order->find('all', array(
            'contain'=>array("Info"),
            'conditions'=>array('Order.sale_id' => $sale, 'Order.site_id' => $businesses),
            'order'=> array('last_name' => 'ASC')));

问题在于,当我这样做时,我得到一个数组到字符串转换错误,因为$ BUSINESS是一个嵌套数组,所以Cake将其转换为

AND `Order`.`site_id` IN (Array, Array, Array, Array, Array, Array, Array, Array, Array, Array, Array, Array, Array, Array, Array)

如何访问嵌套数组,以便将订单上的site_id与数组中每个业务的site_id进行比较?

1 个答案:

答案 0 :(得分:2)

您不需要从find()返回的所有信息来运行您的下一个查询。

你基本上需要的是SQL的IN表达式和一系列ID,它们应该像下面那样:

$this->Order->find('all', array(
    'conditions'=>array(
        'Order.site_id' => Hash::extract($businesses, '{n}.Business.site_id')
     )
));

Hash::extract()将创建{n}.Business.site_id提供的路径$businesses中包含的id数组,而cakephp会注意到你有一个数组,因此它将创建一个SQL {{1}表达式告诉你的数据库你希望id是给定的那个。

你应该让你以前的发现只返回你需要的东西(即ids和主键),以减轻数据库的负担。