CakePHP 3 find () с порядком foreach в каждой строке

1

Человек, я не знаю, почему это не работает, я следую за Мануэлем дословно.

У меня есть таблица 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++;
    }
  • 0
    При получении ошибок всегда показывайте точное сообщение об ошибке и включайте возможные трассировки стека и контекстную информацию!
  • 0
    спасибо NDM для моего спасения :) я приложил сообщение об ошибке, стек трассировки будет много, чтобы вставить, надеюсь, сообщение об ошибке достаточно
Теги:
cakephp
cakephp-3.0

2 ответа

2
Лучший ответ

order является зарезервированным словом и не может использоваться в некотируемом (в данном случае не обратном) способе, его нужно будет использовать в форме 'order'

Видеть

Я бы предложил изменить имя столбца, что является самым простым и неэффективным, влияющим на исправление. Другим вариантом было бы включить автоматическое цитирование идентификатора, это, однако, повлияет на производительность и не может применяться повсеместно, см.

Cookbook> Доступ к базе данных и ORM> Основы баз данных> Идентификатор Quoting

  • 0
    спасибо, я забыл об этом
2

order - зарезервированное ключевое слово в SQL, поэтому, если вы хотите использовать имя столбца, вам нужно использовать кавычки, например:

SELECT * FROM table ORDER BY 'order' ASC

Как вы можете видеть в ошибке, это не цитируется.

Возможно, вам нужно использовать $this->Model->query() и написать запрос вручную.

Другим решением является изменение столбца "порядок" на другое имя.

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню