4

我正在使用 Zend DB 使用以下代码生成查询:

$table->select()
        ->setIntegrityCheck(false) //required for multi-table join
        ->from('modules')
        ->joinInner(
            'basket_modules',
            'modules.id = basket_modules.id')
        ->joinInner(
            'baskets',
            'baskets.id = basket_modules.basket_id')
        ->where('baskets.id = ?', $this->id);

这将生成 SQL:

SELECT modules.*, basket_modules.*, baskets.*
FROM modules
INNER JOIN basket_modules ON modules.id = basket_modules.id
INNER JOIN baskets ON baskets.id = basket_modules.basket_id
WHERE (baskets.id = '3')

我的问题在于 SELECT 部分,它选择了所有 3 个表,而不仅仅是我想要的模块。所以我想要生成的查询是:

SELECT `modules`.*
FROM `modules`
#etc...

我怎样才能做到这一点?如果我手动编辑查询并运行它,它会返回我想要的内容,因此语法应该没有问题。

4

3 回答 3

6

请查看手册Zend_Db_Select中的示例。滚动到示例 #13。

要从表中不选择任何列,请使用空数组作为列列表。这种用法也适用于 from() 方法,但通常您需要查询中的主表中的某些列,而您可能不希望连接表中的列。

$select = $db->select()
         ->from(array('p' => 'products'),
                array('product_id', 'product_name'))
         ->join(array('l' => 'line_items'),
                'p.product_id = l.product_id',
                array() ); // empty list of columns
于 2013-04-11T11:53:30.610 回答
2

您可以为其他表和主表指定列名,如下所示

$table->select()
    ->setIntegrityCheck(false) //required for multi-table join
    ->from('modules',array('modules.*'))
    ->joinInner(
        'basket_modules',
        'modules.id = basket_modules.id',array('basket_modules.id'))
    ->joinInner(
        'baskets',
        'baskets.id = basket_modules.basket_id',array('baskets.id'))
    ->where('baskets.id = ?', $this->id);

所以sql会像

SELECT modules.*, basket_modules.id, baskets.id
FROM modules
INNER JOIN basket_modules ON modules.id = basket_modules.id
INNER JOIN baskets ON baskets.id = basket_modules.basket_id
WHERE (baskets.id = '3')
于 2013-04-11T11:50:24.247 回答
1
$table->select()
        ->setIntegrityCheck(false) //required for multi-table join
        ->from('modules')
        ->joinInner(
            'basket_modules',
            'modules.id = basket_modules.id',array(''))
        ->joinInner(
            'baskets',
            'baskets.id = basket_modules.basket_id',array(''))
        ->where('baskets.id = ?', $this->id);

给一个空数组作为第三个参数,join否则它将从加入的表中选择所有字段。如果你想要一些字段,那么在加入时指定数组中的字段名称。

于 2013-04-11T11:52:22.507 回答