использование построителя запросов Laravel для исключения определенной строки

Допустим, у меня есть таблица с именем table, и в ней есть столбец с именем path, формат строки в path выглядит следующим образом

row path
1   /path1/aa/bg/c/da
2   /path1/ab/v
3   /path1/a/ba/ca

Как видите, каждый сегмент разделен символом /. Как отформатировать условие в where, используя like, чтобы единственная возвращаемая строка была row 2 с 2 slashes.

Я пробовал DB::table('table')->where('path','LIKE','/path1/%/%')->get()

Но приведенный выше запрос вернет все строки из-за последнего %. Как я могу исключить / после последнего %, чтобы запись, которая имеет char / после последнего %, не была включена в результат?


person Priska Aprilia    schedule 03.05.2016    source источник
comment
Вы можете использовать форму метода регулярного выражения mysql dev.mysql.com/doc/ refman/5.7/en/regexp.html и метод whereRaw() вместо where   -  person Gumma Mocciaro    schedule 03.05.2016


Ответы (1)


если вы ищете совпадение с одним символом:

DB::table('table')->where('path','LIKE','/path1/_/_')->get()

"test%" соответствует всем символам после

"%test" соответствует всем символам до

"_" соответствует одному символу

ИНАЧЕ, если длина строки, которую вы сопоставляете, является переменной, вы можете использовать только регулярные выражения,

select * from table where path REGEXP '\/path1\/[a-zA-Z0-9_]+\/[a-zA-Z0-9_]+'

более общее соответствие специальным символам:

select * from table where path REGEXP '\/path1\/.+\/.+'
person Danilo Calzetta    schedule 03.05.2016
comment
длина не может быть определена, так как она динамическая. Шаблон предназначен для сопоставления сегментов с сегментами, хранящимися в path, путем сравнения количества back slash - person Priska Aprilia; 03.05.2016
comment
символ после back slash может быть специальным символом, например @. Не могли бы вы помочь мне подробнее рассказать о шаблоне [a-zA-Z0-9_]. Пытается ли он сопоставить любой буквенно-цифровой символ? - person Priska Aprilia; 03.05.2016
comment
здесь regexr.com вы можете проверить свое регулярное выражение, для соответствия @ вы можете использовать это \/path1\/[a- zA-Z0-9_@]+\/[a-zA-Z0-9_@]+ - person Danilo Calzetta; 03.05.2016
comment
это может быть идеальным регулярным выражением для вас, попробуйте \/path1\/.+\/.+ - person Danilo Calzetta; 03.05.2016
comment
Большое спасибо. Как сделать @ необязательным? Я думаю, .+ соответствует любому символу, верно? Последний хорошо работает как в Laravel, так и в phpmyadmin, но первый работает только в phpmyadmin, но последний все равно вернет все записи - person Priska Aprilia; 03.05.2016