【问题标题】:Symfony 4/javascript - UniqueEntity constraint on relationSymfony 4/javascript - 关系上的 UniqueEntity 约束
【发布时间】:2019-01-22 19:13:57
【问题描述】:

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

Admin.php

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

城市.php

/**
 *
 * @ORM\Table(name="city")
 * @ORM\Entity
 * @UniqueEntity(
 *     fields={"admin"},
 *     message="error message here"
 * )
 */
class City
{...}

(我认为注释语法不同,因为 Admin 表是几个月前创建的,当时我还在 Symfony 4.0 上)

但我必须遗漏一些东西,或者它与关系的工作方式不同,因为我仍然收到 SQL 错误消息页面“SQLSTATE[23000]:完整性约束违规:1062 Duplicate entry '1' for key 'UNIQ_3946A254A73F0036'”。

我还想到了一个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;
    }
}

在响应中,“消息”显示为 null,但我希望它是用户输入的字符串(然后我可以继续获取我的城市并检查现有管理员...)

由于我对这两种方法都束手无策,非常感谢您的帮助.. 谢谢!

【问题讨论】:

  • 您是否尝试过使用验证器? symfony.com/doc/current/validation.html
  • 我相信这就是我在使用 UniqueEntity 约束时正在做的事情?我没有看到任何其他适合的约束

标签: javascript php symfony symfony4


【解决方案1】:

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

第一个:

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

【讨论】:

  • 这就是我的表单处理方式 ` if($formAdmin->isSubmitted() && $formAdmin->isValid()) { $repoAdmin = $this->getDoctrine()->getRepository(管理员::类); $repoCity = $this->getDoctrine()->getRepository(City::class); $admin->setCity($city) $city->setAdmin($admin); $em = $this->getDoctrine()->getManager(); $em->persist($admin); $em->persist($city); $em->flush(); }`
  • 你应该添加我在' if($formAdmin->isSubmitted() && $formAdmin->isValid())'之前提到的两行
  • 这意味着:$city->setAdmin($admin); $admin->setCity($city);然后' if($formAdmin->isSubmitted() && $formAdmin->isValid())'
  • $city 应该只在表单提交后才存在。我用一个空白的 City 对象尝试了你的建议,但仍然得到同样的错误
  • 哪个实体是拥有方
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 2022-01-11
  • 2022-01-19
相关资源
最近更新 更多