使用 Yii2 查询生成器创建 mysql 查询,strpos: array given
creating mysql query using Yii2 Query Builder, strpos: array given
我正在尝试使查询生成器输出以下 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 错误还是我遗漏了什么?或者我格式化查询生成器的方式有误?
我使用的是 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']
])
不是分别传递两个参数 - table
和 on
你实际上是在一个参数 - 数组中传递它们。
另外第一个参数(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()方法的官方文档。
我正在尝试使查询生成器输出以下 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 错误还是我遗漏了什么?或者我格式化查询生成器的方式有误?
我使用的是 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']
])
不是分别传递两个参数 - table
和 on
你实际上是在一个参数 - 数组中传递它们。
另外第一个参数(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()方法的官方文档。