2013-09-07 3 views
1

У меня есть объект Customer и User объект с таблицей отношений JOIN customers_users.Doctrine ManyToOne with join table - filter results

В объекте Customer у меня есть это.

/** 
* @var User 
* 
* @ORM\ManyToMany(targetEntity="Entity\User") 
* @ORM\JoinTable(name="customers_users", 
*  joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", unique=true)} 
*) 
* 
*/ 
private $users; 

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

Например, у меня есть два клиента и два пользователя, и первый клиент назначил двух пользователей; Затем, когда я редактирую второй клиент, два пользователя, по всей видимости, возложенные на него, но когда я выбираю их и я отправить форму, он выдает следующее исключение:

An exception occurred while executing 'INSERT INTO customers_users (customer_id, user_id) VALUES (?, ?)' with params [2, 1]: 

SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "uniq_2763c6cca76ed395" 
DETAIL: Key (user_id)=(1) already exists. 

ответ

1
/** 
* @var User 
* 
* @ORM\ManyToMany(targetEntity="Entity\User", inversedBy="customers") 
* @ORM\JoinTable(name="customers_users", 
*  joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", unique=true)} 
*) 
* 
*/ 
private $users; 

и в User лица, в customers аннотаций вы должны поставить:

* @ORM\ManyToMany(targetEntity="Entity\Customer", inversedBy="users") 
(...) 
1

То, что я на самом деле в этой ситуации является:

// UserAdmin.php that extends SonataAdminBundle's User admin 

/** 
* {@inheritdoc} 
*/ 
public function createQuery($context = 'list') 
{ 
    /** @var QueryBuilder $query */ 
    $query = parent::createQuery(); 

    $request = Request::createFromGlobals(); 

    // Could not find another way to detect that admin list is created from 
    // sonata_type_model_list parent. 
    // Of course, this applies only to sonata_type_model_list field type. 

    if ($request->query->get('pcode') == 'demo.admin.customer') { 
     $alias = $query->getRootAliases()[0]; 

     $query->leftJoin($alias . '.customers', 'c'); 
     // $query-> ... do filtering here 
    } 

    return $query; 
} 

Таким образом, я мог бы фильтровать пользователей так, как я хотел.