2014-12-03 3 views
0

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

Я пробую несколько запросов с построителем запросов, но безуспешно.

Ниже приведен пример моей структуры базы данных.

TABLENAME: Пользователь

+----+----------+-----------+ 
| id | isActive | isDeleted | 
+----+----------+-----------+ 
| 1 |  1 |   0 | 
+----+----------+-----------+ 

TABLENAME: Роль

+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | Admin | 
+----+-------+ 

TABLENAME: USER_ROLE

ManyToMany связь между пользователем и ролью

+---------+---------+ 
| user_id | role_id | 
+---------+---------+ 
|  1 |  1 | 
+---------+---------+ 

TABLENAME: расстояние

OneToMany связь между пользователем и поваренной расстояния

+----+---------+-----+------+ 
| id | user_id | lat | long | 
+----+---------+-----+------+ 
| 1 |  1 |  |  | 
+----+---------+-----+------+ 

Я пишу простой SQL-запрос, который является правильным для меня, но я не знаю, как я могу реализовать отношение многих ко многим к строителю запросов.

SELECT u.id 
FROM user as u, user_role as ur 
WHERE u.id=ur.user_id and ur.role_id=1 OR 
(u.id not in (select user_id from distance) and ur.role_id=1 and u.id=ur.user_id); 

Может кто-нибудь дать мне подсказку, как я могу решить эту проблему?

Update

я покажу только некоторые части лиц, из-за читаемости и ясности.

class User implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Exclude 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\Role", inversedBy="users") 
    * 
    */ 
    protected $roles; 

    /** 
    * @ORM\OneToMany(targetEntity="App\UserBundle\Entity\Distance", mappedBy="user", cascade={"persist", "remove"}) 
    * @Exclude 
    */ 
    protected $distance; 

} 


class Role implements RoleInterface 
{ 

    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="name", type="string", length=255) 
    * @Exclude 
    */ 
    private $name; 

    /** 
    * @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\User", mappedBy="roles") 
    */ 
    private $users; 
} 


class Distance 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="distance", cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    protected $user; 

} 
+0

Можете ли вы разместить свои объекты? –

+0

Я добавляю некоторые важные части моих сущностей, это нормально? – smartcoderx

+0

Mab82x, вы можете «пинговать» пользователей в комментариях, добавляя символ «@» перед своим именем. Например, вы могли бы сказать - @LordZed, я добавил некоторые важные части моих сущностей. Достаточно ли этого? - и плакат будет извещен. – AHiggins

ответ

0

Вы можете попробовать такой DQL (или simillar). Пожалуйста, проверьте Doctrine DQL documenation

SELECT u FROM App\UserBundle\Entity\User u 
INNER JOIN u.role r 
LEFT JOIN u.distance d 
WHERE r.id = 1 OR (r.id = 1 AND d IS NULL) 

BTW Вы уверены, что ваш SQL в порядке? Я не уверен, если это не дает те же результаты, как

SELECT u.id 
FROM user as u, user_role as ur 
WHERE u.id=ur.user_id and ur.role_id=1 

тогда DQL будет тривиальным

SELECT u FROM App\UserBundle\Entity\User u 
INNER JOIN u.role r 
WHERE r.id = 1 
0

@ l3l0 много спасибо, это решить мою проблему :)

добавить теперь следующая функция в моем репозитории пользователя и все это нормально :)

public function getUsers2Crawl($role) 
{ 
    $query = $this->getEntityManager()->createQuery('SELECT u FROM App\UserBundle\Entity\User u INNER JOIN u.roles r LEFT JOIN u.distance d WHERE r.id = $role->getId() OR (r.id = $role->getId() AND d IS NULL)'); 
    return $query->getResult(); 
} 
Смежные вопросы