私はUser
、Problem
、Submission
の3つのエンティティを持っています。そのユーザーがすでに解決している場合、同じ質問を複数回は解決できないように制限しようとしています。 User
エンティティには、各ユーザーのSubmissions
をチェックしてメソッドを作成しました。しかし、problem_idフィールドとuser_idフィールドを一致させる方法を見つけられず、投稿が正しかったかどうかがわかりました。Doctrine-Symfony 3で既に投稿されていることを確認してください
ここにはエンティティがあります。 Problem.php
class Problem
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, unique=True)
* @Assert\NotBlank(message="Please enter a valid title")
*/
protected $title;
/**
* @ORM\Column(type="text")
* @Assert\NotBlank(message="Please enter a valid description")
*/
protected $description;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank(message="Please enter a valid value")
*/
protected $points;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank(message="Please enter a valid flag")
*/
protected $flag;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank(message="Please enter a valid value")
*/
protected $category;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="problems")
* @ORM\JoinColumn(name="createdby", referencedColumnName="id")
*/
protected $createdby;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Submission", mappedBy="problem_id")
*/
protected $submissions;
/**
* @Gedmo\Slug(fields={"title"})
* @ORM\Column(type="string", length=255, unique=false,)
*/
protected $slug;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
*/
private $updatedAt;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Discussion", mappedBy="problem")
*/
private $discussions;
/**
* @ORM\Column(type="boolean")
*/
protected $isPublished = True;
}
Submission.php
class Submission
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Problem", inversedBy="submissions")
* @ORM\JoinColumn(name="problem_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $problem_id;
/**
* @ORM\Column(type="boolean")
*/
protected $correct = false;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="submissions")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user_id;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank(message="Flag cannot be blank")
*/
protected $submission_flag;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
*/
private $updatedAt;
}
User.php クラスのユーザーは、たUserInterface 実装{あなたが提出エンティティに@UniqueConstraintを試すことができるかもしれ
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, unique=true)
* @Assert\NotBlank(message="Please enter a valid email address")
* @Assert\Email()
*/
private $username;
/**
* @ORM\Column(type="string", length=255, unique=true)
* @Assert\NotBlank(message="Please enter a valid email address")
*/
private $usrname;
/**
* @Assert\NotBlank()
* @Assert\Length(max=4096)
*/
private $plainPassword;
/**
* The below length depends on the "algorithm" you use for encoding
* the password, but this works well with bcrypt.
*
* @ORM\Column(type="string", length=64)
*/
private $password;
/**
* @ORM\Column(type="string", length=255, unique=true)
* @Assert\NotBlank(message="Please enter a valid name")
*/
private $fullname;
/**
* @var array
* @ORM\Column(name="roles", type="json_array")
*/
protected $roles;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Problem", mappedBy="createdby")
*/
protected $problems;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Feed", mappedBy="createdby")
*/
protected $feeds;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="createdby")
*/
protected $comments;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Submission", mappedBy="user_id")
*/
protected $submissions;
}
。私の場合は、提出が正しかった場合に限り、ユーザーに1回提出してほしい。提出が間違っていた場合、ユーザーはそれが正しくなるまで複数の提出を行うことができます。 – mburakergenc
その場合は、コントローラのチェックをしたいと思うでしょう。エンティティのロジックを確認してから、更新を実行し、それを維持/フラッシュします。私はできるだけ多くの論理を自分の存在から守ろうとしています。 –