Symfony 4 / javascript - ограничение UniqueEntity для отношения - PullRequest
0 голосов
/ 22 января 2019

Я работаю над формой Symfony 4.2 для регистрации администратора.Моя административная сущность имеет двустороннее отношение один к одному с городской сущностью.Я хотел предоставить пользователю сообщение об ошибке, когда предоставленный им Город уже связан с существующим администратором.Сначала я попытался использовать тот же метод, который я использую для предотвращения дублирования писем в других объектах.Я поместил ограничение UniqueEntity в обе сущности и пространство для ошибок форм в моем шаблоне.

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
{...}

(IПредположим, что синтаксис аннотаций отличается, потому что таблица Admin была создана несколько месяцев назад, когда я еще работал на Symfony 4.0)

Но я, должно быть, что-то упустил, или это работает по-другому с отношениями, потому что я все еще получаю SQLстраница сообщения об ошибке «SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись« 1 »для ключа« UNIQ_3946A254A73F0036 »».

Я также подумал о методе javascript для вызова базы данных и проверки, является ли Городпредоставленный пользователем, уже связан с администратором, что было бы еще лучше, потому что без обновления и все такое, но я не могу получить результаты из моего запроса.

на стороне клиента, вызывается по ключу

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' отображает ноль, но я хочу, чтобы это была строка, введенная пользователем (тогда ямог бы забрать мой город и проверить существующего администратора ...)

Поскольку я нахожусь в стойле с обоими методами, ваша помощь очень ценится .. Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Итак, у вас есть два способа сделать это

Первый:

//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(); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...