Свяжите две сущности с автоматически не сгенерированным идентификатором - PullRequest
0 голосов
/ 04 июня 2019

Я занимаюсь веб-сайтом, на котором клиенты подключаются к нему с идентификатором, который связан с машиной, которая генерирует данные.Эта машина отправляет эти данные в CSV-файл с тем же идентификатором.Я хочу показать данные на веб-сайте, чтобы клиент мог видеть свои собственные данные, а не другие.Я создал свои две сущности с их свойствами.В классе Property у меня есть отношение ManyToOne, поскольку у пользователя может быть несколько свойств, а свойство может быть связано только с одним пользователем.

Класс свойства:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="properties")
 * @ORM\JoinColumn(nullable=false)
 */
private $user;

public function getUser(): ?User
{
    return $this->user;
}

public function setUser(?User $user): self
{
    $this->user = $user;

    return $this;
}

Класс пользователя:

private $username; /*This is the ID of the machine in User, people connect 
                     to the website with it*/

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Property", mappedBy="user")
 */
private $properties;

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

Автоматически сгенерированные геттеры и установщики в User:

public function getUsername(): ?string
{
    return $this->username;
}

public function setUsername(string $username): self
{
    $this->username = $username;

    return $this;
}

Автоматически сгенерированное свойствометоды в User:

/**
 * @return Collection|Property[]
 */
public function getProperties(): Collection
{
    return $this->properties;
}

public function addProperty(Property $property): self
{
    if (!$this->properties->contains($property)) {
        $this->properties[] = $property;
        $property->setUser($this);
    }

    return $this;
}

public function removeProperty(Property $property): self
{
    if ($this->properties->contains($property)) {
        $this->properties->removeElement($property);
        // set the owning side to null (unless already changed)
        if ($property->getUser() === $this) {
            $property->setUser(null);
        }
    }

    return $this;
}

Вот как я пытаюсь получить данные из файла csv с идентификатором в моем классе csv:

    /*Read csv file and put the result array in $results*/

    foreach ($results as $row) {

        $properties = (new Property)
            ->set/*Some properties*/
            ->setUser($row['user'])
            ->setDate(new \DateTime());

            $this->em->persist($properties);
    }
    $this->em->flush();

Очевидно, что это не работает, потому что $ user не инициализирован, и я хочу иметь возможность получить строку идентификатора вместо объекта $ user.Проблема в том, что я не знаю, как получить строку и связать ее с пользователем.Должен ли я просто сделать оператор if в файле ветки, чтобы показать только то, что я хочу, или есть хороший способ сделать это?

Редактировать

Я пыталсячто-то, но это ничего не изменило.Я пытался связать свойство с пользователем при его создании, но, похоже, он ничего не делает при рендеринге страницы.Я по-прежнему получаю все имущество, а не только то, которое мне полагается.(те, которые имеют тот же идентификатор, что и пользователь).

Вот код

    $properties = (new Property)
            ->set/*Some properties*/
            ->setmachineId($row['machineId']) /*Changed this to string in entity class*/
            ->setDate(new \DateTime());

            $this->em->persist($properties);
    }

    $users = $this->em->getRepository(User::class);
    foreach($users as $user){
        if($properties->getMachineId() === $user->getUsername()){
            $user->addProperty($properties);
            $properties->setUser($user);
        }  
    }

    $this->em->flush();

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Я не знаю, возможно ли это, поэтому я просто помещаю некоторые операторы if в свой шаблон, и это работает таким образом.Это менее элегантно, но это хорошо.Если у кого-то есть идея получше, скажите, пожалуйста!

0 голосов
/ 04 июня 2019

Это

foreach ($results as $row) {

    $properties = (new Property)
        ->set/*Some properties*/
        ->setUser($this->em->getReference(User, $row['user']))
        ->setDate(new \DateTime());

        $this->em->persist($properties);
}
$this->em->flush();

Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...