Я думаю, что вам не нужно расширять стандартное поведение Doctrine, если вы не хотите, чтобы это было полностью автоматически. Но все же Вы можете попытаться сделать это так, как мы делаем - мы используем DAO (объект доступа к данным), который возвращает нам конкретную сущность Doctrine (представление таблицы Doctrine):
\DAO::get('Some\Namespace\Classname')
где Classname
обозначает таблицу, описанную моделью класса PHP. Наш класс DAO создает экземпляр Classname
, который инкапсулируется в proxy
(см. Шаблоны проектирования).
Помимо модели класса таблицы, мы создаем еще один класс для этой таблицы, который стоит над моделью таблицы и манипулирует этой моделью. Внутри этого класса мы пишем методы типа getProducts($args)
, getProduct($id)
, getProductsByCategory($catId)
и т. Д.
Я думаю, что это то, что Вы ищете ...
В методе getProducts($args)
Затем вы можете реализовать ->leftJoin()
в DQL, который присоединится к таблице переводов с помощью заданного $lang
идентификатора в параметре $args
. Простой пример (не тестировался):
class Products extends \DAO {
public function save($item) {
$item->save();
}
public function getProducts($args = array()) {
$order = array('p.id');
$result = \Doctrine_Query::create()
->from('Some\Namespace\Product p')
->where('1 = 1');
if(!empty($args['lang'])) {
$result = $result->leftJoin('Some\Namespace\ProductTranslation pt ON pt.product_id = p.id AND pt.language = ?', $args['lang']);
}
$result = $result->orderBy($order);
$result = $result->execute();
return $result;
}
}
Затем по телефону
$products = DAO::get('Some\Namespace\Product')->getProducts(array('lang' => 1));
Вы получаете все продукты с загруженными английскими переводами ...
Он не настолько автоматизирован, и вам нужно написать собственный класс DAO для каждой модели, но это хороший подход, поскольку у вас есть другой класс определения данных (модель) и класс манипулирования данными (контроллер), которые необходимы для объекта MVC / MVP ориентированная архитектура приложения ...