CakePHP 3 DeleteAll, где первые 4 буквы не http

Как мне создать этот оператор SQL с cakephp 3;

 delete FROM bookmarks WHERE substring(url , 4) != 'http'

Я пытался;

$this->Bookmark->deleteAll('substring(Bookmark.url,4) !=' => 'http',false);   

Cakephp не любит функцию Substring или LEFT()


person fuzzy dunlop    schedule 08.04.2016    source источник
comment
не нравится — это неправильное описание проблемы! Несмотря на то, что на это может быть ответ в нынешнем виде, пожалуйста, всегда будьте как можно более конкретными в отношении того, что точно происходит, и что вы ожидаете вместо этого.   -  person ndm    schedule 09.04.2016
comment
Кроме того, вероятно, это дубликат stackoverflow.com/questions/30845997/.   -  person ndm    schedule 09.04.2016


Ответы (1)


Как насчет этого:

$this->Bookmark->deleteAll([
    'NOT' => ['SUBSTRING(url, 1, 4)' => 'http'],
]);
person Dave    schedule 09.04.2016
comment
Это создаст недопустимый SQL, так как в запросах DELETE ключ условия подвергается удалению псевдонимов, что в основном работает как дайте мне все после возможной точки, так что вы получите что-то вроде WHERE NOT (url, 4) = 'http'). Это будет работать без псевдонима, но использование выражения, которое будет поддерживать автоматическое цитирование и преобразование диалекта, может быть лучшим/более переносимым выбором (да, я знаю, SUBSTRING еще не подлежит преобразованию). Кстати, это должно быть 1, 4, а не просто 4. - person ndm; 09.04.2016
comment
да, он сделал плохой запрос, не знаю, как это исправить. Кажется, что функция подстроки SQL игнорируется. выход; УДАЛИТЬ ИЗ ЗАКЛАДОК, ГДЕ НЕТ (url, 4) = 'http' - person fuzzy dunlop; 09.04.2016