ORM Решение для действительно сложных запросов - PullRequest
2 голосов
/ 25 октября 2011

Можно / нужно ли использовать какое-либо решение ORM в такой сложной ситуации? это можно сделать с помощью Propel или Doctrine? на данный момент я использую Propel. Так что я был бы рад, если есть решение Propel для этого.
Если я сделаю прямой запрос с Propel, что предложение?

SELECT I.*,((I.width*175)/I.height) as relativeWidth FROM 
(SELECT * FROM Image WHERE owner = 1 LIMIT 5, 10) I
order by relativeWidth asc

и дополнительно. Каково стандартное решение для сценария, в котором необходимо выполнить действительно сложные запросы в большинстве мест приложения?

Существует LIMIT 5, 10, который я использую для нумерации страниц. и это во внутреннем запросе. Если его в поле зрения, как я могу контролировать нумерацию страниц?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Ваш запрос может быть записан в Propel 1.6.3 следующим образом:

<?php

// SELECT * FROM Image WHERE owner = 1 LIMIT 5, 10
$subQuery = ImageQuery::create()
    ->filterByOwner(1)
    ->limit(10)
    ->offset(5)
    ;

$query = ImageQuery::create()
    ->addSelectQuery($subQuery, 'I', true)
    ->withColumn('((I.WIDTH*175)/I.HEIGHT)', 'relativeWidth') // ((I.width*175)/I.height) as relativeWidth
    ->orderBy('relativeWidth') // default is 'asc'
    ;

$params = array();
var_dump(\BasePeer::createSelectSql($query, $params));

Вывод:

SELECT I.ID, I.WIDTH, I.HEIGHT, I.OWNER, ((I.WIDTH*175)/I.HEIGHT) AS relativeWidth
FROM (
    SELECT image.ID, image.WIDTH, image.HEIGHT, image.OWNER
    FROM `image`
    WHERE image.OWNER=:p1 LIMIT 5, 10
) AS I
ORDER BY relativeWidth ASC

Обратите внимание: :p1 - это параметр привязки, связанный с владельцемvalue.

Так что создавать сложные запросы с помощью Propel :) очень просто:)

William

0 голосов
/ 25 октября 2011

Некоторые запросы лучше всего исправить с помощью view, imo. Правда, это не для пуристов ORM, но я нашел это очень приемлемым подходом, в то же время получая выгоду от ORM. Я бы сказал, что в рамках одного проекта вы должны делать это только в 10% случаев; если вы обнаружите, что пишете представление для большинства своих утверждений ORM, то, возможно, потребуется другой подход.

Несмотря на это, приведенный вами пример довольно прост. Я был бы склонен написать специальный метод, использующий сырой SQL в классе пира, и обработать его вручную, согласно моему примеру по вашему связанному вопросу. Просто помните, что при запуске raw sql легче стать жертвой SQL-инъекции - не забудьте экранировать, очистить или параметризировать ваши переменные.

...