2017-07-13 12 views
0

私はUserProblemSubmissionの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

。次のようなものがあります:

/** 
* @Entity 
* @Table(uniqueConstraints={@UniqueConstraint(name="unique_user_submission", columns={"name", "email"})}) 
*/ 
class Submission 
{ 
} 

私はこれらの2つのフィールドを複合的な一意のフィールドにすると思います。ユーザーは唯一、それは間違っていた場合でも、一度提出を作ることができるようになります方法

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-uniqueconstraint

+0

。私の場合は、提出が正しかった場合に限り、ユーザーに1回提出してほしい。提出が間違っていた場合、ユーザーはそれが正しくなるまで複数の提出を行うことができます。 – mburakergenc

+0

その場合は、コントローラのチェックをしたいと思うでしょう。エンティティのロジックを確認してから、更新を実行し、それを維持/フラッシュします。私はできるだけ多くの論理を自分の存在から守ろうとしています。 –

関連する問題