2014-02-11 3 views
1

Я пытаюсь сделать запрос с массивами в Symfony2, и у меня возникают некоторые проблемы.Соответствующий массив запросов Symfony2

У меня есть два объекта с одним полем массива (я использую его как поле тега). Мое намерение состоит в том, что когда у меня есть объект Entity1, я бы запросил БД для выбора объектов Entity, имеющих хотя бы один общий тег. Кто-нибудь знает, как я могу это сделать?

Я также хотел бы узнать, можно ли отсортировать результаты как можно большего числа совпадений с низкими (т. Е. Те, у кого больше общих тегов, появляются первые).

Пример структуры сущностей:

Entity1: 
    - id = 1 
    - tags = {'Football', 'Soccer', 'Premier Leage'} 

Entity2: 
    - id = 2 
    - tags = {'Football', 'Hockey', 'Tennis'} 

Большое спасибо, ребята!

UPDATE:

Теперь у меня есть Entity1 и entity2 с ManyToMany к Entity под названием метки. Теперь это SQL получает мне правильный entity2 ID:

SELECT e2.entity2_id, COUNT(e2.entity2_id) AS common_tag_count 
FROM entity2_tags AS e2 
INNER JOIN entity1_tags AS e1 ON e2.tags_id = e1.tags_id 
WHERE e1.entity1_id =3 
GROUP BY e2.entity2_id 
HAVING e2.entity2_id !=2 
ORDER BY COUNT(e2.tags_id) DESC 

Теперь я не могу объединить две таблицы в простой РЕГИСТРИРУЙТЕСЬ с DQL, потому что в DQL мы не можем использовать автоматические таблицы Doctrine (entity1_tags и entity2_tags).

Кто-нибудь знает, как я могу преобразовать код SQL в DQL?

ответ

1

Doctrine ORMarray тип сохраняется в базе данных как сериализованные данные. Поскольку это всего лишь строка, вы не можете делать такие запросы, какие пожелаете. У вас есть два возможных пути ее решения:

  1. Используйте отдельную таблицу для тегов с ManyToMany или ManyToOne отношений
  2. Использование доктрины simple_array типа для сохранения тегов, а затем запрашивать их с помощью поиска полнотекстового. Полнотекстовый доступ не доступен для всех СУБД, поэтому вам может понадобиться какой-либо поисковый сервер, такой как сфинкс или аналогичный.
+0

Я уже думал о возможности использования отдельных таблиц, но и у меня такая же проблема. Не могли бы вы объяснить процедуру для использования с отдельными таблицами? – Mateu

1

Im помощью:

$qb = $filterQuery->getQueryBuilder(); 
$orX = $filterQuery->getExpr()->orX(); // or andX 

foreach ($values['value'] as $value) { 
    $column = $filterQuery->getExpr()->concat($filterQuery->getExpr()->literal(','), $filterQuery->getExpr()->concat($field, $filterQuery->getExpr()->literal(','))); 
    $orX->add($filterQuery->getExpr()->like($column, $filterQuery->getExpr()->literal("%,{$value},%"))); 
} 

$qb->andWhere($orX); 

Смежные вопросы