Человек, я не знаю, почему это не работает, я следую за Мануэлем дословно.
У меня есть таблица ProductStyles, которая имеет столбец заказа. Предположим, что у меня 5 строк. И я удаляю номер 3. Я хочу найти все строки, соответствующие идентификатору продукта, и перебирать каждый из них, заменяя порядок # поэтапно.
Productstyle Table
id - product_id - order
Мой первый шаг - просто получить все строки, соответствующие идентификатору продукта, чтобы я мог сделать foreach, но я продолжаю получать ошибки SQL. Честно говоря, я не знаю SQL, что хорошо, кроме основного выбора.
$query = $this->ProductStyles->find()
->where(['product_id'=> 1 ])
->order(['order' => 'ASC'])
;
//debug($query);
//debug( $query->all() ); //this throws an error
Сообщение об ошибке:
Ошибка: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с "order ASC" в строке 1
SQL:
//SELECT ProductStyles.id AS 'ProductStyles__id', //ProductStyles.product_id AS
//'ProductStyles__product_id', ProductStyles.style_id AS //'ProductStyles__style_id',
//ProductStyles.order AS 'ProductStyles__order' FROM product_styles ProductStyles
//WHERE product_id = :c0 ORDER BY order ASC
//die;
$i = 1;
foreach ($query as $row) {
//debug($row); die;
$ps= $this->ProductStyles->get($row->id);
//debug($ps);die;
$ps->order = $i;
$this->ProductStyles->patchEntity($ps,['order'=> $i]);
$this->ProductStyles->save($ps);
$i++;
}
order
является зарезервированным словом и не может использоваться в некотируемом (в данном случае не обратном) способе, его нужно будет использовать в форме 'order'
Видеть
Я бы предложил изменить имя столбца, что является самым простым и неэффективным, влияющим на исправление. Другим вариантом было бы включить автоматическое цитирование идентификатора, это, однако, повлияет на производительность и не может применяться повсеместно, см.
Cookbook> Доступ к базе данных и ORM> Основы баз данных> Идентификатор Quoting
order
- зарезервированное ключевое слово в SQL, поэтому, если вы хотите использовать имя столбца, вам нужно использовать кавычки, например:
SELECT * FROM table ORDER BY 'order' ASC
Как вы можете видеть в ошибке, это не цитируется.
Возможно, вам нужно использовать $this->Model->query()
и написать запрос вручную.
Другим решением является изменение столбца "порядок" на другое имя.
Надеюсь это поможет.