Запрос с критерием исключения ошибки в doctrine2, Symfony2

1

У меня проблема в symfony2 и doctrine2. Когда я добавляю исключение Criteria, оно не появляется, как я хочу. Это код:

Модель

/**
 * @ORM\ManyToMany(targetEntity="users",inversedBy="friends",cascade={"ALL"})
 * @ORM\JoinTable(name="friends",
 *      joinColumns={@ORM\JoinColumn(name="friend_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      )
 */
private $friendsof;

public function getusersre() {

    $criteria = new Criteria();
    $criteria->Where($criteria->expr()->eq('accepted', '1'));
    return $this->friendsof->matching($criteria);

}

Вывод

SELECT te.id AS id, te.email AS email, te.username AS username
FROM users te JOIN friends t ON t.user_id = te.id
WHERE t.friend_id = ? AND te.accepted = ?

Я хочу, чтобы это выглядело так:

WHERE t.friend_id = ? AND t.accepted = ?
  • 0
    Не могли бы вы добавить код сущности « Users ?
  • 0
    это jpst.it/DkP7
Показать ещё 2 комментария
Теги:
doctrine
doctrine2
zend-framework2

1 ответ

0
Лучший ответ

Доктрина создает промежуточную таблицу для отношений от Many to Many. И вы не можете добавить какое-либо поле в эту таблицу. Я имею в виду, что поле accepted. Также у вас есть три таблицы:

  • Пользователи.
  • Промежуточная таблица для многих-многих отношений.
  • Друзья.

В вашей функции getusersre вы хотите попробовать получить друзей. Насколько я понял, невозможно добавить accepted поле для ваших критериев, как вы хотели.

Также я изменил вашу структуру. Что вы думаете об этом?

class User
{

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

   /**
    * @var string
    *
    * @ORM\Column(name="username", type="string", length=255, unique=true)
    */
   private $username;


   /**
    * @ORM\OneToMany(targetEntity="Friend", mappedBy="userId")
    */
   private $friends;

   //Other fields, getters and setters.
}

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

   /**
    * @ORM\ManyToOne(targetEntity="User", inversedBy="friends")
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
    */
   protected $userId;

   /**
    * @ORM\ManyToOne(targetEntity="User", inversedBy="friends")
    * @ORM\JoinColumn(name="friend_id", referencedColumnName="id")
    */
   protected $friendId;

   /**
    * @ORM\Column(name="accepted", type="boolean")
    */
   protected $accepted;

   //Other fields, getters and setters
}

Имя объекта Friend не является твердым. Вы можете использовать FriendRelationship.

Кроме того, функции getAcceptedFriends понравятся.

public function getAcceptedFriends()
{
    $cr = Criteria::create();
    $cr->andWhere($cr->expr()->eq('accepted', 1));

    return $this->friends->matching($cr);
}

Или

public function getAcceptedFriends()
{
    $friends = [];
    /** @var Friend $friend */
    foreach ($this->friends as $friend) {
        if ($friend->getAccepted()) $friends[] = $friend;
    }

    return $friends;
}

Вы можете так использовать.

foreach($user->getAcceptedFriends() in $friendRelationship){

   // $friendRelationship is a instance of Friend.
   $username = $friendRelationship->getFriendId()->getUsername();
}

В прутьях

{% for fr in user.acceptedFriends %}
    {{ fr.friendId.username }}
{% else %}
    {{ 'No friend' }}
{% endfor %}
  • 0
    большое спасибо, я уверен, что это правильный ответ .. Но у меня все еще есть небольшая проблема: целевой объект social \ socialBundle \ Entity \ Friend не может быть найден в 'social \ socialBundle \ Entity \ users # friends
  • 0
    Я предпочитаю использовать заглавные буквы для сущностей, контроллеров, сервисов. О вашей проблеме, измените всех Friend на friends , User на users .
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню