Как получить один объект если таблица связующая(ManyToMany)?
Всем привет, возник вопрос. У меня есть 3 таблицы у них связь ManyToMany. Таблицы Page, Role, PageAccess. Таблица PageAccess связующая у нее есть поля role_id, page_id, visible. Поля role_id и page_id это составной первичный ключ. Когда я запросом из таблицы Page выбираю одну страницу я бы хотел что бы у меня был метод в который я бы к примеру мог передать $role_id и в результат получить один объект PageAccess. Как это можно сделать? Это нужно как то описать связь OneToOne в таблице Page? или просто метод писать какой то?
Станислав, ну я могу создать связь OneToMany и разом получить все "доступы" для конкретной страницы, но мне нужно для конкретной страницы и конкретной роли, т.е. формально это связь по двум полям, но поле role_id я по идее могу только передать в метод, ну это я так вижу, но я не уверен что так стоит делать)
Максим Лагойский уточните пожалуйста, перечисленные вами Page, Role, PageAccess - это таблицы в базе данных или Doctrine entities? Для организации связи вы используете ManyToMany связь реализуемую Doctrine или поддерживаете связь вручную, имея отдельный entity для таблицы PageAccess? В зависимости от этого здесь могут быть разные варианты.
Станислав, есть 2 сущности Page и Role и есть 3 таблицы page, role, page_access. Создать 3-ю сущность PageAccess проблем нет если это поможет. Сущности я упростил тут.
Сущность Page
class Page
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="title", type="string", length=64, nullable=false)
*/
private $title;
/**
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* Many Pages have Many Roles.
* @ORM\ManyToMany(targetEntity="Role")
* @ORM\JoinTable(name="page_access",
* joinColumns={@ORM\JoinColumn(name="page_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $roles;
public function __construct()
{
$this->roles = new ArrayCollection();
}
public function getRoles(): Collection
{
return $this->roles;
}
}
Сущность Role
class Role
{
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(name="id", type="integer", nullable=false)
*/
private $id;
/**
* @ORM\Column(name="role", type="string", length=45, nullable=false)
*/
private $role;
/**
* Many Users have Many Projects.
* @ORM\ManyToMany(targetEntity="Page")
* @ORM\JoinTable(name="page_access",
* joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="page_id", referencedColumnName="id")}
* )
*/
private $pages;
public function __construct()
{
$this->pages = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getRole(): ?string
{
return $this->role;
}
public function setRole(?string $role): self
{
$this->role = $role;
return $this;
}
public function getPages(): Collection
{
return $this->pages;
}
}