2013-09-07 2 views
1

나는 Customer 엔터티와 User 엔터티에 JOIN 관계 테이블 customers_users이 있습니다.Doctrine Join 테이블이있는 ManyToOne - 필터 결과

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; 

나는 고객이 생성 될 때 나는 그것에 사용자를 할당 할 수 원하는 실제로는 잘 작동합니다.

예를 들어 2 명의 고객과 2 명의 사용자가 있고 첫 번째 고객이 2 명의 사용자를 할당했습니다. 내가 두 번째 고객을 편집 한 후 때, 두 명의 사용자가 할당 한 것으로 나타났습니다하지만이를 선택하고 내가 양식을 보낼 때, 그것은 다음과 같은 예외가 발생합니다 :에,

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; 
} 

이렇게하면 원하는 방식으로 사용자를 필터링 할 수 있습니다.