У меня проблема в 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 = ?
Доктрина создает промежуточную таблицу для отношений от 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 %}
Friend
на friends
, User
на users
.
Users
?