Экспресс-запрос SQL на языке программирования

Сложно выразить язык SQL на языке программирования.

Например этот запрос:

select * from users
where exists (
    select 1 from videos 
    where
    concat(users.first_name, ' ', users.last_name) ILIKE videos.title
)

Не обращайте внимания на то, что запрос не оптимизирован или глуп, это всего лишь пример.

У вас есть соединения, операторы, функции в sql.

Я хочу избежать использования sql в методах - sql должен быть в модели или библиотеке базы данных.

Например, есть ли у вас какие-либо предложения по запросу.

Users.whereExists(
...
)

Спасибо

Почему бы не использовать ту же систему, что и доктрину (и, возможно, другие), что-то вроде этой imgur.com/JfQ9yV2 Ну, это немного изобретает колесо, но это работает.

Jules R 04.12.2018 10:53

На мой взгляд, приложение должно взаимодействовать только с моделью User, используя что-то вроде User::exists() - модель User имеет собственную модель интерфейса базы данных, оптимизированную для любой базы данных, которую вы используете (например, она содержит оптимизированный запрос). Вне уровня интерфейса базы данных остальная часть приложения не должна необходимость общаться с базой данных в любом случае ... если вы на самом деле не пишете переносимый фреймворк. Стоит только моя туппенс.

CD001 04.12.2018 11:08

Но, например, функция concat принадлежит ли она пользователю или классу базы данных?

user2693928 04.12.2018 11:42

В этом примере? В классе базы данных, поскольку вы имеете дело конкретно с тем, как структурированы данные - например, похоже, вы ищете подстроку в videos.title ... это, конечно, не обязательно означает, что вам нужно делать это в SQL.

CD001 04.12.2018 12:59

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

user2693928 04.12.2018 13:08

Вы бы не использовали методы базы данных в контроллере, контроллер общается только с моделью User ... модель User взаимодействует с моделью UserDatabase (или любым другим соглашением об именах, которое вы используете), чтобы получить данные и обновить себя. Вы должен теоретически сможете отключить всю базу данных, просто обновив классы интерфейса базы данных - или создать классы интерфейса для нескольких серверов баз данных. Вы можете использовать ORM для этого, но не необходимость.

CD001 04.12.2018 14:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
37
1

Ответы 1

Как я понял, вам не нравится писать код sql в свой файл языка программирования, относительно того же у меня есть простая идея.

1) просто создайте хранимую процедуру в mysql db через этот код DELIMITER // DROP PROCEDURE IF EXISTS procedure_name;// CREATE PROCEDURE procedure_name() BEGIN select * from users where exists ( select 1 from videos where concat(users.first_name, ' ', users.last_name)
LIKE videos.title ) END;
2) Затем запустите этот оператор в свой программный файл с кодом "call procedure_name;".

таким образом вы заменили весь код однострочным оператором.

Работает, но запрос динамический. Я имею в виду, что у меня есть несколько фильтров, и в зависимости от них я генерирую запрос. Предложение "где существует" могло или не могло существовать, также это простой запрос. Когда у меня большой запрос, например 20-50 строк, мне трудно объявить его с помощью методов на выбранном языке программирования. Если я добавлю одну процедуру для всех комбинаций, это будут очень комбинации и сложная логика.

user2693928 04.12.2018 11:45

Друг мой, если ваш запрос является динамическим, эта процедура сможет работать с динамическими периметрами, а также с этим <code> CREATE PROCEDURE имя_процедуры (perameter_1 CHAR (32), perameter_2 INT UNSIGNED, PhoneNumber VARCHAR (20)) <code> в этом вы сможете передать все параметры в соответствии с вашими потребностями

Nikhil singh thakur 05.12.2018 07:16

Другие вопросы по теме