Symfony 4/javascript-关系的唯一性约束

Symfony 4/javascript-关系的唯一性约束,javascript,php,symfony,symfony4,Javascript,Php,Symfony,Symfony4,我正在为管理员注册制作Symfony 4.2表格。我的管理实体与城市实体具有一对一的双向关系。我想为用户提供一条错误消息,说明他提供的城市已绑定到现有管理员。首先,我尝试使用我用来防止在其他实体中重复电子邮件的相同方法。我在两个实体中都设置了Uniquentity约束,并在模板中为表单错误设置了一个空格 Admin.php /** * @ORM\Entity(repositoryClass="App\Repository\AdminRepository") * * @UniqueEnti

我正在为管理员注册制作Symfony 4.2表格。我的管理实体与城市实体具有一对一的双向关系。我想为用户提供一条错误消息,说明他提供的城市已绑定到现有管理员。首先,我尝试使用我用来防止在其他实体中重复电子邮件的相同方法。我在两个实体中都设置了Uniquentity约束,并在模板中为表单错误设置了一个空格

Admin.php

 /**
 * @ORM\Entity(repositoryClass="App\Repository\AdminRepository")
 *  * @UniqueEntity(
 *     fields={"city"},
 *     message="error message here"
 * )
 * @Vich\Uploadable
 */
class Admin
{ ... }
City.php

/**
 *
 * @ORM\Table(name="city")
 * @ORM\Entity
 * @UniqueEntity(
 *     fields={"admin"},
 *     message="error message here"
 * )
 */
class City
{...}
(我想注释语法是不同的,因为Admin表是几个月前创建的,当时我还在使用Symfony 4.0)

但我肯定遗漏了什么,或者它与关系的工作方式不同,因为我仍然会收到SQL错误消息页面“SQLSTATE[23000]:完整性约束冲突:1062重复项'1'用于键'uniq3946A254A73F0036'”

我还想到了一个javascript方法来调用数据库,并检查用户提供的城市是否已经与管理员关联,这会更好,因为没有刷新,但我无法从请求中检索结果

客户端,调用keyup

function cityRequest(){
    var cityCode = document.getElementById("city").value;
    if(cityCode) {
        $.ajax({
            type: 'post',
            url: "{{ path('checkCity')}}",
            data: {
            city_code:cityCode,
        },
            success: function (response) {
                $('#cityMsg').html(response);
            }
        });
    } else { 
        ...
    }
}
请求控制器

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

class AjaxController extends AbstractController
{
    /**
     * @Route("/ajaxrequest", name="checkCity", methods="GET|POST")
     */
    public function checkCity(Request $request)
    {
        $code= $request->get('city_code');
        $response = new JsonResponse(array(
            'message' => $code));
        return $response;
    }
}
在响应中,“message”显示null,但我希望它是用户输入的字符串(然后我可以继续获取我的城市并检查现有的管理员…)


由于我正在使用这两种方法,非常感谢您的帮助。。谢谢

那么你有两种方法可以做到这一点

第一个:

//City.php
/**
 * @UniqueEntity(
 *      fields={"admin"},
        repositoryMethod = "findAdmin"),
 *      message="error message here"
 * )
*/
class City
{...}





//CityRepository.php
public function findAdmin($admin)
    {
        return $this->createQueryBuilder('c')->leftJoin('c.admin', 'a')
            ->andWhere('a = :admin')
            ->setParameter('admin', $admin)
            ->getQuery()
            ->getResult()
            ;
    }


//YourController.php
if($formAdmin->isSubmitted()) 
{
    $repoAdmin = $this->getDoctrine()->getRepository(Admin::class); 
    $repoCity = $this->getDoctrine()->getRepository(City::class);  
    $city->setAdmin($admin);
    if($formAdmin->isValid()){      
        $admin->setCity($city) 

        $em = $this->getDoctrine()->getManager(); 
        $em->persist($admin); 
        $em->persist($city);`enter code here`
        $em->flush(); 
    }
}
第二条:

//YourController.php
if($formAdmin->isSubmitted()) 
{
    $repoAdmin = $this->getDoctrine()->getRepository(Admin::class); 
    $repoCity = $this->getDoctrine()->getRepository(City::class);  
    $city->setAdmin($admin);
    if($formAdmin->isValid() && $admin->getCity()==null){       //you just add this controller, it is a controller check level
        $admin->setCity($city) 

        $em = $this->getDoctrine()->getManager(); 
        $em->persist($admin); 
        $em->persist($city);
        $em->flush(); 
    }
}

所以你有两种方法

第一个:

//City.php
/**
 * @UniqueEntity(
 *      fields={"admin"},
        repositoryMethod = "findAdmin"),
 *      message="error message here"
 * )
*/
class City
{...}





//CityRepository.php
public function findAdmin($admin)
    {
        return $this->createQueryBuilder('c')->leftJoin('c.admin', 'a')
            ->andWhere('a = :admin')
            ->setParameter('admin', $admin)
            ->getQuery()
            ->getResult()
            ;
    }


//YourController.php
if($formAdmin->isSubmitted()) 
{
    $repoAdmin = $this->getDoctrine()->getRepository(Admin::class); 
    $repoCity = $this->getDoctrine()->getRepository(City::class);  
    $city->setAdmin($admin);
    if($formAdmin->isValid()){      
        $admin->setCity($city) 

        $em = $this->getDoctrine()->getManager(); 
        $em->persist($admin); 
        $em->persist($city);`enter code here`
        $em->flush(); 
    }
}
第二条:

//YourController.php
if($formAdmin->isSubmitted()) 
{
    $repoAdmin = $this->getDoctrine()->getRepository(Admin::class); 
    $repoCity = $this->getDoctrine()->getRepository(City::class);  
    $city->setAdmin($admin);
    if($formAdmin->isValid() && $admin->getCity()==null){       //you just add this controller, it is a controller check level
        $admin->setCity($city) 

        $em = $this->getDoctrine()->getManager(); 
        $em->persist($admin); 
        $em->persist($city);
        $em->flush(); 
    }
}

你试过使用验证器吗?我相信当我使用uniquentity约束时我就是这么做的?我看不到任何其他约束,您是否尝试过使用验证器?我相信当我使用uniquentity约束时我就是这么做的?我看不到任何其他适合的约束这就是我的表单处理看起来的样子`if($formAdmin->isSubmitted()&&&$formAdmin->isValid()){$repoAdmin=$this->getdoctor()->getRepository(Admin::class);$repoCity=$this->getdoctor()->getRepository(City::class);$Admin->setCity($City)$city->setAdmin($admin);$em=$this->getdoctor()->>getManager();$em->persist($admin);$em->persist($city);$em->flush();}`您应该在“if($formAdmin->isSubmitted()&&&$formAdmin->isValid()”之前添加我提到的两行,这意味着:$city->setAdmin($admin); $admin->setCity($city);然后,“如果($formAdmin->isSubmitted()&&&$formAdmin->isValid())”$city只应在提交表单后存在。我用一个空白的City对象尝试了您的建议,但仍然得到了相同的错误,即哪个实体是拥有方这就是我的表单处理看起来的样子`if($formAdmin->isSubmitted()&&&&$formAdmin->isValid()){$repoAdmin=$this->getDoctrine()->getRepository(Admin::class);$reposity=$this->getDoctrine()->getRepository()->(City::class);$admin->setCity($City)$City->setAdmin($admin);$em=$this->getdoctor()->>getManager();$em->persist($admin);$em->persist($City);$em->flush();}`您应该在'if($formAdmin->isSubmitted()之前添加我提到的两行&&&$formAdmin->isValid())'这意味着:$city->setAdmin($admin);$admin->setCity($city);然后“如果($formAdmin->Isubmitted()&&&$formAdmin->isValid()”,$city只应该在表单提交后存在。我用一个空白的city对象尝试了您的建议,但仍然得到相同的错误,即哪个实体是拥有方