使用非自动生成的ID链接两个实体

时间:2019-06-04 14:22:16

标签: php mysql symfony csv

我正在做一个网站,客户端在该网站上使用ID链接到该网站,该ID链接到生成数据的计算机。本机将数据发送到具有相同ID的csv文件中。我想在网站上显示数据,以便客户端可以看到他们自己的数据,而不是其他人。我用它们的属性创建了两个实体。在Property类中,由于一个User可以具有多个属性,而一个属性只能链接到一个用户,因此我具有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();
}

用户中自动生成的吸气剂和吸气剂:

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

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

    return $this;
}

用户中自动生成的属性方法:

/**
 * @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类中具有ID的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,并且我希望能够获得ID字符串而不是$ user对象。问题是我不知道如何获取字符串并将其与用户链接。我是否只需要在树枝文件中创建一个if语句即可仅显示我想要的内容,或者有什么好方法吗?

修改

我尝试了一些东西,但没有任何改变。我尝试在创建属性时将其链接到User,但是在渲染页面时似乎没有任何作用。我仍然拥有所有财产,而不仅仅是我应该拥有的财产。 (与用户具有相同ID的用户)。

这是代码

    $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 :(得分:0)

这吗?

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();

documentation

答案 1 :(得分:0)

我不知道是否有可能,所以我只是在模板中放置了一些if语句,它就这样工作。它不那么优雅,但很好。如果有人有更好的主意,请告诉我!