Учение - ManyToMany - PullRequest
       20

Учение - ManyToMany

0 голосов
/ 30 января 2019

Я действительно надеюсь, что кто-то может помочь мне с этим, потому что это сводит меня с ума, что-то, что должно быть настолько простым

Пример таблиц базы данных (ID - это основной столбец во всех таблицах)

Exhibitors
id  |   name       |   address_line_1
3   |  Test Name   |   Test 123 Street
4   |  Test Name 2 |  Test 123 Street 1
5   |  Test Name 3 |  Test 123 Street 2
6   |  Test Name 4 |  Test 123 Street 2

Shows
id  |   name             |  location
7   |  The Greatest Show |   USA
8   |  Super Show        |   London, UK
9   |  A Great Show      |   Toronto, CA
10  |  Fab Show          |  NEC, Birmingham, UK


Links
id  |   show_id  |  exhibitor_id | agent_id | type
1   |       7    |      3        |   null   |  1
1   |       7    |      5        |   null   |  1
1   |       8    |      3        |   null   |  1
1   |       10   |      6        |   null   |  1

Теперь ссылка, которую я пытаюсь сделать, является многоканальной, поэтому, по сути, каждая выставка может иметь несколько экспонентов, и наоборот, каждый участник может быть назначен на несколько шоу.Текущие сущности создают целую новую таблицу с именем ppShowExhibLinks, которую я не очень хочу, но я действительно застрял ...

Таблица ссылок будет содержать ссылки различного рода, следовательно, тип и agent_id, так что как-то япытаюсь заставить отношения сделать что-то вроде:

$ show = new Show ();$ show-> getExhibitors ();

Затем выполняется что-то вроде «Получить все ссылки, где show_id - текущее шоу, а тип - 1»

Затем обратное

$show = новый экспонент ();$ Шоу-> getShows ();Затем он делает что-то вроде «Получить все ссылки, где экспонент является текущим экспонентом, а тип равен 1»

PS: я знаю, что новый экземпляр объекта не будет иметь никаких ссылок на экспонаты / шоу, а только для демонстрации объекта.

 Entities

    /**
    * @ORM\Table(name="ppShows")
    * @ORM\Entity(repositoryClass="App\Repository\ShowRepository")
    */
    class Show
    {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    protected $name;


    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    protected $location;

   /**
     * @var \Doctrine\Common\Collections\Collection|Exhibitor[]
     *
     * @ORM\ManyToMany(targetEntity="Exhibitor", inversedBy="shows")
     * @ORM\JoinTable(
     *  name="ppShowExhibLinks",
     *  joinColumns={
     *      @ORM\JoinColumn(name="show_id", referencedColumnName="id")
     *  },
     *  inverseJoinColumns={
     *      @ORM\JoinColumn(name="exhibitor_id", referencedColumnName="id")
     *  }
     * )
     */
    protected $exhibitors;



********************************************


class Exhibitor
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    protected $name;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    protected $address_line_1;

   /**
     * @var \Doctrine\Common\Collections\Collection|Show[]
     *
     * @ORM\ManyToMany(targetEntity="Show", inversedBy="exhibitors")
     * @ORM\JoinTable(
     *  name="ppShowExhibLinks",
     *  joinColumns={
     *      @ORM\JoinColumn(name="show_id", referencedColumnName="id")
     *  },
     *  inverseJoinColumns={
     *      @ORM\JoinColumn(name="exhibitor_id", referencedColumnName="id")
     *  }
     * )
     */
    protected $shows;





class Link
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

     /**
     * @ORM\Column(type="integer", options={"default" : 0}, nullable=true)
     */
    protected $show_id;

     /**
     * @ORM\Column(type="integer", options={"default" : 0}, nullable=true)
     */
    protected $exhibitor_id;

    /**
     * @ORM\Column(type="integer", options={"default" : 0}, nullable=true)
     */
    protected $agent_id;

      /**
     * @ORM\Column(type="integer", options={"default" : 1}, nullable=false)
     */
    protected $type;

1 Ответ

0 голосов
/ 30 января 2019

Необходимо добавить отношение к Link для таблиц Show и Exhibitor.

Показать объект:

    /**
     * One show may have many links
     * @OneToMany(targetEntity="Link", mappedBy="show")
     */
    private $links;
    // ...

    public function __construct() {
        $this->links = new ArrayCollection();
    }

Объект участника

    /**
     * One Exhibitor may have many links
     * @OneToMany(targetEntity="Link", mappedBy="exhibitor")
     */
    private $links;
    // ...

    public function __construct() {
        $this->links = new ArrayCollection();
    }

Ссылка на сущность:

/**
 * Many links have one product.
 * @ManyToOne(targetEntity="Show", inversedBy="links")
 * @JoinColumn(name="show_id", referencedColumnName="id")
 */
private $show;

/**
 * Many links have one exhibitor.
 * @ManyToOne(targetEntity="Exhibitor", inversedBy="links")
 * @JoinColumn(name="exhibitor_id", referencedColumnName="id")
 */
private $exhibitor;

Хорошо, теперь Show и Exhibitor теперь связаны друг с другом через отношение «многие ко многим», и оба связаны с 3-й Link сущностью через «множество».отношения один-на-один.Это, вероятно, вы ищете.Теперь вы можете получить все шоу от экспонента, как, например,

$exhibitor->getShows()

и наоборот

$show->getExibitors();

и, наконец, получить все ссылки из репозитория

$this->linkRepository->findBy([ "show" => %show_id%, "type" => %type% ]);
...