php - 使用 Yii2 查询生成器创建 mysql 查询,strpos : array given

标签 php mysql yii2

我正在尝试让查询构建器输出以下 MySQL 查询:

SELECT p1.id, p1.product_id, p1.updated_at
FROM tbl_scrape_data p1
INNER JOIN
(
   SELECT max(updated_at) MaxDate, product_id
   FROM tbl_scrape_data
   WHERE product_id IN (1,2,3)       
   GROUP BY product_id
) p2
ON p1.product_id = p2.product_id
AND p1.updated_at = p2.MaxDate
WHERE p1.product_id IN (1,2,3)   
order by p1.updated_at desc

这是我尝试过的:

$scrapeData = (new Query() )
        ->select(['p1.product_id', 'p1.id', 'p1.updated_at'])
        ->from('tbl_scrape_data p1')
        ->innerJoin([
            'p2' => (new Query)
                ->select(['MAX(updated_at) MaxDate', 'product_id' ])
                ->from('tbl_scrape_data')
                ->where([ 'product_id' => [1, 2, 3, 15, 4] ])
                ->groupBy('product_id'),
                //->all(),
            ['p1.product_id' => 'p2.product_id', 'p1.updated_at' => 'p2.MaxDate']
            ])
        ->where([ 'p1.product_id' => [1, 2, 3, 15, 4] ])
        ->orderBy('p1.updated_at DESC')
        ->all();

Yii2 尝试执行此查询时抛出错误。有人可以告诉我这是 Yii2 的 bug 还是我遗漏了什么吗?或者我格式化查询生成器的方式可能是错误的?

我使用的是 Yii 2.0.1,错误是

strpos() expects parameter 1 to be string, array given

\vendor\yiisoft\yii2\db\QueryBuilder.php at line 715

最佳答案

错误原因在这一段代码中:

->innerJoin([
    'p2' => (new Query)
        ->select(['MAX(updated_at) MaxDate', 'product_id' ])
        ->from('tbl_scrape_data')
        ->where([ 'product_id' => [1, 2, 3, 15, 4] ])
        ->groupBy('product_id'),
        //->all(),
        ['p1.product_id' => 'p2.product_id', 'p1.updated_at' => 'p2.MaxDate']
])

实际上,您不是分别传递两个参数 - tableon,而是将它们传递到一个参数 - 数组中。

第一个参数 (table) 应该是包含一个元素的数组。

换句话说,方括号的位置不正确。

所以这是 INNER JOIN 部分的正确代码:

->innerJoin(
    ['p2' => (new Query)
        ->select(['MAX(updated_at) MaxDate', 'product_id' ])
        ->from('tbl_scrape_data')
        ->where([ 'product_id' => [1, 2, 3, 15, 4] ])
        ->groupBy('product_id'),
        //->all(),
    ],
    ['p1.product_id' => 'p2.product_id', 'p1.updated_at' => 'p2.MaxDate']
)

查看innerJoin()的官方文档方法。

关于php - 使用 Yii2 查询生成器创建 mysql 查询,strpos : array given,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892945/

相关文章:

phpMyAdmin 不显示表格

php - 将图片保存到mysql数据库的有效方法

PHP Mysql IF 语句

php - 浏览器 MMORPG 基本理念

php - Yii2 在不使用 GridView 的情况下显示数据库中的数据

php - 如何使用 Yii2 的 PayPal 扩展在 yii2 中集成支付网关

PHP 启动 :Unable to start dynamic library

php - 添加命名空间到 Zend_Feed_Writer_Feed

php - 为什么我的 php 代码不能执行任何操作?

php - Yii2:数组的验证规则?