Laravel 5.1 — Привязки параметров подзапроса применяются в неправильном порядке?

У меня есть следующий запрос на обновление, который состоит из соединения подзапроса (мне пришлось использовать DB: Raw, так как я не смог найти какую-либо документацию для выполнения любым другим способом — если кто-то не может показать мне какой-то другой способ достижения этого).

Однако, поскольку обновляемая таблица / модель использует временные метки, значение для updated_at также добавляется и портит порядок привязок параметров?

OrderItemProduct::from('order_item_product as t1')
->join(DB::Raw('(
SELECT t1.product_id as product_id
, MIN(t1.created_at) as created_at
, MIN(t1.order_item_id) as order_item_id
FROM order_item_product t1
INNER JOIN order_items t2 on t1.order_item_id = t2.id
INNER JOIN orders t3 on t2.order_id = t3.id
WHERE t1.product_id = ?
AND t1.available > 0
AND TIMESTAMPADD(DAY,t1.valid_days,t1.created_at) > now()
AND t3.user_id = ?
GROUP BY t1.product_id) AS t2'), function($join)
{
$join->on('t1.order_item_id', '=', 't2.order_item_id');
$join->on('t1.created_at', '=', 't2.created_at');

})
->setBindings([$productId, $userId])
->decrement('t1.available');

Ниже приводится то, с чем я сталкиваюсь, когда умираю и сбрасываю журнал запросов:

array:1 [▼
0 => array:3 [▼
"query" => """update `order_item_product` as `t1` inner join (\r\n
SELECT t1.product_id as product_id\r\n
\t                  , MIN(t1.created_at) as created_at\r\n
\t\t                , MIN(t1.order_item_id) as order_item_id\r\n
\t\t             FROM order_item_product t1\r\n
INNER JOIN order_items t2 on t1.order_item_id = t2.id\r\n
INNER JOIN orders t3 on t2.order_id = t3.id\r\n
WHERE t1.product_id = ?\r\n
AND t1.available > 0\r\n
AND TIMESTAMPADD(DAY,t1.valid_days,t1.created_at) > now()\r\n
\t                AND t3.user_id = ?\r\n
GROUP BY t1.product_id) AS t2 ON `t1`.`order_item_id` = `t2`.`order_item_id`
AND `t1`.`created_at` = `t2`.`created_at`
SET `t1`.`available` = `t1`.`available` - 1, `updated_at` = ?
""""bindings" => array:3 [▼
0 => "2017-02-04 09:41:22"1 => 1
2 => 1
]
"time" => 2.9
]
]

Как вы можете видеть внутри массива bindings, значение для updated_at автоматически добавляется eloquent в индексе 0, и поэтому оно заканчивается привязкой к заполнителю первого параметра в запросе, что неверно.

Так что вместо WHERE t1.product_id = 1 это заканчивается как WHERE t1.product_id = "2017-02-04 09:41:22" и то же самое для всех остальных параметров — все в неправильном порядке.

Почему значение для столбца updated_at добавляется первым в массив bindings — не следует ли его добавлять в конец массива?

Как я могу это исправить?

* ОБНОВИТЬ *

Когда я проверяю Illuminate\Database\Eloquent\Builder для decrement Метод я вижу следующее:

public function decrement($column, $amount = 1, array $extra = [])
{
$extra = $this->addUpdatedAtColumn($extra);

return $this->query->decrement($column, $amount, $extra);
}

protected function addUpdatedAtColumn(array $values)
{
if (! $this->model->usesTimestamps()) {
return $values;
}

$column = $this->model->getUpdatedAtColumn();

return Arr::add($values, $column, $this->model->freshTimestampString());
}

Arr :: add делает следующее:

public static function add($array, $key, $value)
{
if (is_null(static::get($array, $key))) {
static::set($array, $key, $value);
}

return $array;
}

Таким образом, чтобы исключить его из добавления addUpdatedAtColumn Метод, который я должен был включить столбец в запрос на обновление, как показано ниже:

`->decrement('t1.available', 1, ['updated_at' => DB::Raw('now()')]);`

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]