Сложно выразить язык 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(
...
)
Спасибо
На мой взгляд, приложение должно взаимодействовать только с моделью User, используя что-то вроде User::exists() - модель User имеет собственную модель интерфейса базы данных, оптимизированную для любой базы данных, которую вы используете (например, она содержит оптимизированный запрос). Вне уровня интерфейса базы данных остальная часть приложения не должна необходимость общаться с базой данных в любом случае ... если вы на самом деле не пишете переносимый фреймворк. Стоит только моя туппенс.
Но, например, функция concat принадлежит ли она пользователю или классу базы данных?
В этом примере? В классе базы данных, поскольку вы имеете дело конкретно с тем, как структурированы данные - например, похоже, вы ищете подстроку в videos.title ... это, конечно, не обязательно означает, что вам нужно делать это в SQL.
Но я хочу использовать только модель. Это лучше, по крайней мере, в книгах, потому что если я изменю базу данных, я изменю модели, и она будет работать. Но если я использую методы из базы данных в контроллере, может быть, будет сложнее
Вы бы не использовали методы базы данных в контроллере, контроллер общается только с моделью User ... модель User взаимодействует с моделью UserDatabase (или любым другим соглашением об именах, которое вы используете), чтобы получить данные и обновить себя. Вы должен теоретически сможете отключить всю базу данных, просто обновив классы интерфейса базы данных - или создать классы интерфейса для нескольких серверов баз данных. Вы можете использовать ORM для этого, но не необходимость.






Как я понял, вам не нравится писать код 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)
2) Затем запустите этот оператор в свой программный файл с кодом
LIKE videos.title
)
END;
"call procedure_name;".
таким образом вы заменили весь код однострочным оператором.
Работает, но запрос динамический. Я имею в виду, что у меня есть несколько фильтров, и в зависимости от них я генерирую запрос. Предложение "где существует" могло или не могло существовать, также это простой запрос. Когда у меня большой запрос, например 20-50 строк, мне трудно объявить его с помощью методов на выбранном языке программирования. Если я добавлю одну процедуру для всех комбинаций, это будут очень комбинации и сложная логика.
Друг мой, если ваш запрос является динамическим, эта процедура сможет работать с динамическими периметрами, а также с этим <code> CREATE PROCEDURE имя_процедуры (perameter_1 CHAR (32), perameter_2 INT UNSIGNED, PhoneNumber VARCHAR (20)) <code> в этом вы сможете передать все параметры в соответствии с вашими потребностями
Почему бы не использовать ту же систему, что и доктрину (и, возможно, другие), что-то вроде этой imgur.com/JfQ9yV2 Ну, это немного изобретает колесо, но это работает.