Php 使用ResolveTargetEntityListener时,关联字段的类型实体的预期值改为Entity1

Php 使用ResolveTargetEntityListener时,关联字段的类型实体的预期值改为Entity1,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我正在使用条令中的ResolveTargetEntityListener访问外部数据库中的SQL表 当我使用createQueryBuilder查询外部/基本车辆类的数据时,我得到以下错误: 关联字段AppBundle\Entity\FM\u Positions$truck的类型AppBundle\Entity\VehicleFox的预期值为$truck,取而代之的是FoxBundle\Entity\Vehicle 在内部VehicleFox类上执行此操作时,查询返回NULL 有什么我错过的吗

我正在使用条令中的ResolveTargetEntityListener访问外部数据库中的SQL表

当我使用createQueryBuilder查询外部/基本车辆类的数据时,我得到以下错误:

关联字段AppBundle\Entity\FM\u Positions$truck的类型AppBundle\Entity\VehicleFox的预期值为$truck,取而代之的是FoxBundle\Entity\Vehicle

在内部VehicleFox类上执行此操作时,查询返回NULL

有什么我错过的吗

下面是我正在使用相关功能进行查询的控制器。我还包括了已经使用过的类和接口以及config.yml文件

FMC控制器

<?php

namespace BWT\FMBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\HttpFoundation\Request;
use Vendors\FM;
use AppBundle\Entity\FuelData;
use MaxBundle\Entity\UdoDriver;
use FoxBundle\Entity\Vehicle;
use AppBundle\Entity\FM_Positions;

class FMController extends Controller
{
    public function latestPositionsAction(Request $request)
    {
        $_render_args = array();
        $_results = array();
        $tripProcesses = new FM();
        $success = $this->login($tripProcesses);

        If ($success === true) {
            $_results = $tripProcesses->getTrackingData();
        }
        if ($_results) {
            $_render_args['results'] = $_results;
        }
        $this->CreateFmPositions($_results);
        return $this->render('Telematics/latestPositions.html.twig', $_render_args);
    }

    private function CreateFmPositions(array $results)
    {
        foreach ($results as $result){

            $resultArray = (array) $result;
            $vehicle = $this->getVehicleFM($resultArray['VehicleID']);
            $position = new FM_Positions();
            if ($vehicle) {
                $position->setTruck($vehicle[0]);
            }
            $em = $this->getDoctrine()->getManager();
            $em->persist($position);
            $em->flush();
        }
    }

    private function getVehicleFM(int $vehFmId)
    {
        $repository = $this->getDoctrine()->getRepository('FoxBundle:Vehicle', 'foxem'); // error for incorrect Entity
        //$repository = $this->getDoctrine()->getRepository('AppBundle:VehicleFox'); // returns NULL
        $query = $repository->createQueryBuilder('v')
        ->where('v.fmId = :fmid')
        ->setParameter('fmid', $vehFmId)
        ->getQuery()
        ->getResult();

        return $query;
    }
}
位置类型表格

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;

class FM_PositionsType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('position_id')
            ->add('truck_id', EntityType::class, Array(
                'class' => 'FoxBundle:Vehicle',
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('v')
                    ->orderBy('v.fleetNumber', 'ASC');
                },
                'placeholder' => 'Select A Truck',
                'choice_label' => 'fleetNumber',
                'em' => 'foxem',
                ))
            ->add('driver_id', EntityType::class, Array(
                'class' => 'MaxBundle:UdoDriver',
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('d')
                    ->orderBy('d.nickname', 'ASC');
                },
                'placeholder' => 'Select A Driver',
                'choice_label' => 'nickname',
                'em' => 'max2em',
                ))
            ->add('date')
            ->add('latitude')
            ->add('longitude')
            ->add('heading')
            ->add('speed')
            ->add('altitude');
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\FM_Positions'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_fm_positions';
    }


}

如果我明白的话,您正在尝试创建新的FM_位置实体,但当您尝试选择一个车辆并将其与位置关联时,您可能会遇到异常或空结果是正确的@OlivierCDid,您尝试精确使用entityManager,因为您没有默认的$repository=$this->getDoctrine->getRepository'AppBundle:VehicleFox',maxem';我已经设置了默认的实体管理器:maxem,还尝试了$repository=$this->getdoctor->getRepository'AppBundle:VehicleFox',maxem';我仍然得到一个空结果我猜结果数组来自一个表单,你能提供表单的代码和你构建它的动作吗
<?php
namespace FoxBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * Vehicle
 * @ORM\Table(name="vehicle", uniqueConstraints={@ORM\UniqueConstraint(name="fleet_number", columns={"fleet_number"})}, indexes={@ORM\Index(name="log_book_date", columns={"log_book_date"})})
 * @ORM\Entity
 */
class Vehicle
{
    /**
     * @var string|null
     * @ORM\Column(name="fleet_number", type="string", length=20, nullable=true)
     */
    private $fleetNumber;

    /**
     * @var string|null
     * @ORM\Column(name="FM_ID", type="string", length=20, nullable=true)
     */
    private $fmId;

    // ...
}
<?php
// src/AppBundle/Entity/VehicleFox.php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use FoxBundle\Entity\Vehicle as BaseVehicle;
use AppBundle\Model\VehicleInterface;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="vehicle_fox")
 */
class VehicleFox extends BaseVehicle implements VehicleInterface
{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string|null
     * @ORM\Column(name="fleet_number", type="string", length=20, nullable=true)
     */
    private $fleetNumber;

    /**
     * @var string|null
     * @ORM\Column(name="FM_ID", type="string", length=20, nullable=true)
     */
    private $fmId;

     /**
      * @ORM\OneToMany(targetEntity="FM_Positions", mappedBy="truck")
      */
    private $fm_positions;
}
<?php
// src/AppBundle/Model/VehicleInterface.php

namespace AppBundle\Model;

interface VehicleInterface
{

    public function __construct();
    /**
     * @return string
     */
    public function getId();
    public function addTruckUnit(\AppBundle\Entity\Truck_Units $truckUnit);
    public function removeTruckUnit(\AppBundle\Entity\Truck_Units $truckUnit);
    public function getTruckUnits();
    public function addFmPosition(\AppBundle\Entity\FM_Positions $fmPosition);
    public function removeFmPosition(\AppBundle\Entity\FM_Positions $fmPosition);
    public function getFmPositions();
    public function addFmTrip(\AppBundle\Entity\FM_Trips $fmTrip);
    public function removeFmTrip(\AppBundle\Entity\FM_Trips $fmTrip);
    public function getFmTrips();
    public function addSkytrackPosition(\AppBundle\Entity\Skytrack_Positions $skytrackPosition);
    public function removeSkytrackPosition(\AppBundle\Entity\Skytrack_Positions $skytrackPosition);
    public function getSkytrackPositions();

}
doctrine:
  # ...
  orm:
    resolve_target_entities:
        AppBundle\Model\VehicleInterface: AppBundle\Entity\VehicleFox
    auto_generate_proxy_classes: "%kernel.debug%"
    default_entity_manager: maxem
    entity_managers:
        maxem:
            connection: maxdb
            mappings:
                AppBundle: 
        foxem:
            connection: foxdb
            mappings:
                FoxBundle: ~
<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;

class FM_PositionsType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('position_id')
            ->add('truck_id', EntityType::class, Array(
                'class' => 'FoxBundle:Vehicle',
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('v')
                    ->orderBy('v.fleetNumber', 'ASC');
                },
                'placeholder' => 'Select A Truck',
                'choice_label' => 'fleetNumber',
                'em' => 'foxem',
                ))
            ->add('driver_id', EntityType::class, Array(
                'class' => 'MaxBundle:UdoDriver',
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('d')
                    ->orderBy('d.nickname', 'ASC');
                },
                'placeholder' => 'Select A Driver',
                'choice_label' => 'nickname',
                'em' => 'max2em',
                ))
            ->add('date')
            ->add('latitude')
            ->add('longitude')
            ->add('heading')
            ->add('speed')
            ->add('altitude');
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\FM_Positions'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_fm_positions';
    }


}