原则从A中获得所有不在B中的元素

时间:2018-11-12 15:02:00

标签: php symfony doctrine

完全错误

CRITICAL - Uncaught PHP Exception Twig_Error_Runtime: "An exception has been thrown during the rendering of a template ("[Semantical Error] line 0, col 170 near 'imagenes WHERE': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.") in "WORK2WORKSitioExperienceBackendBundle:ExpPromociones:new.html.twig" at line 40." at C:\xampp\htdocs\WORK-universos\app\cache\universos_dev\classes.php line 4440 

我有两个查询来选择A中所有不在B中的元素,但是我无法将其翻译为学说

SELECT * 
FROM beneficioWORK.imagenes im
LEFT JOIN beneficioWORK.imagenes_x_exppromociones impro
ON im.id=impro.id_imagen
where impro.id_imagen is null;

OR

select *
from beneficioWORK.imagenes a
where a.id
NOT IN (
    SELECT id_imagen 
    FROM beneficioWORK.imagenes_x_exppromociones
);

在学说上,我试图做这样的事情,但是我得到了一个错误Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected."

这是我的代码:

    $imagenes = $em->createQueryBuilder()
    ->select('img')
    ->addSelect('img_pro')
    ->from('WORK2WORKSitioUniversosImagenesBundle:Imagenes', 'img')
    ->leftjoin('WORK2WORKSitioExperienceFrontendBundle:Exppromociones', 'img_pro', 'WITH', 'img.id=img_pro.imagenes')
    ->where('img_pro.imagenes is null')
    ->getQuery()
    ->getResult();

我有一个实体,即Exppromociones.php 这是我实体的一部分,我想这就是您所需要的,因为它真的很长

    <?php

namespace WORK2\WORK\SitioExperience\FrontendBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Exppromociones
 */
class Exppromociones
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $nombre;

    /**
     * @var string
     */
    private $descripcion;

    /**
     * @var integer
     */
    private $puntos;

    /**
     * @var \DateTime
     */
    private $fechaInicio;

    /**
     * @var \DateTime
     */
    private $fechaFin;

    /**
     * @var boolean
     */
    private $enPromocion;

    /**
     * @var string
     */
    private $vigenciaDescripcion;

    /**
     * @var string
     */
    private $miniDescripcion;

    /**
     * @var integer
     */
    private $puntosOtros;

    /**
     * @var string
     */
    private $flujoCanje;

    /**
     * @var \WORK2\WORK\SitioExperience\FrontendBundle\Entity\ExpCategorias
     */
    private $categoria;

    /**
     * @var \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes
     */
    private $banner;

    /**
     * @var \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes
     */
    private $imagen;

    /**
     * @var \WORK2\WORK\SitioExperience\FrontendBundle\Entity\expcomercios
     */
    private $comercio;

    /**
     * @var string
     *
     * @ORM\Column(name="Nombre_Real", type="text")
     */
    private $nombreReal;

    /**
     * @var string
     *
     * @ORM\Column(name="Descripcion_Experience", type="text")
     */
    private $descripcionExperience;

    /**
     * @var boolean
     */
    private $destacado = false;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $imagenes;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $categorias;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $etiquetas;

    /**
     * @var \DateTime
     */
    private $fechaFinNovedad;

    /**
     * @var integer
     */
    private $cantidadVista = 0;

    /**
     * @var integer
     */
    private $cantidadCanjeada = 0;

    /**
     * @var integer
     */
    private $valorGuaranies = 0; 

    /**
     * @var integer
     */
    private $puntosTelefonico;

    /**
     * @var string
     */
    private $texto_circulo;

    /**
     * @var boolean
     */
    private $mostrarValorGuaranies;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Exppromociones
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Exppromociones
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;

        return $this;
    }

    /**
     * Get descripcion
     *
     * @return string 
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }

    /**
     * Set puntos
     *
     * @param integer $puntos
     * @return Exppromociones
     */
    public function setPuntos($puntos)
    {
        $this->puntos = $puntos;

        return $this;
    }

    /**
     * Get puntos
     *
     * @return integer 
     */
    public function getPuntos()
    {
        return $this->puntos;
    }

    /**
     * Set fechaInicio
     *
     * @param \DateTime $fechaInicio
     * @return Exppromociones
     */
    public function setFechaInicio($fechaInicio)
    {
        $this->fechaInicio = $fechaInicio;

        return $this;
    }

    /**
     * Get fechaInicio
     *
     * @return \DateTime 
     */
    public function getFechaInicio()
    {
        return $this->fechaInicio;
    }

    /**
     * Set fechaFin
     *
     * @param \DateTime $fechaFin
     * @return Exppromociones
     */
    public function setFechaFin($fechaFin)
    {
        $this->fechaFin = $fechaFin;

        return $this;
    }

    /**
     * Get fechaFin
     *
     * @return \DateTime 
     */
    public function getFechaFin()
    {
        return $this->fechaFin;
    }

    /**
     * Set enPromocion
     *
     * @param boolean $enPromocion
     * @return Exppromociones
     */
    public function setEnPromocion($enPromocion)
    {
        $this->enPromocion = $enPromocion;

        return $this;
    }

    /**
     * Get enPromocion
     *
     * @return boolean 
     */
    public function getEnPromocion()
    {
        return $this->enPromocion;
    }

    /**
     * Set vigenciaDescripcion
     *
     * @param string $vigenciaDescripcion
     * @return Exppromociones
     */
    public function setVigenciaDescripcion($vigenciaDescripcion)
    {
        $this->vigenciaDescripcion = $vigenciaDescripcion;

        return $this;
    }

    /**
     * Get vigenciaDescripcion
     *
     * @return string 
     */
    public function getVigenciaDescripcion()
    {
        return $this->vigenciaDescripcion;
    }

    /**
     * Set miniDescripcion
     *
     * @param string $miniDescripcion
     * @return Exppromociones
     */
    public function setMiniDescripcion($miniDescripcion)
    {
        $this->miniDescripcion = $miniDescripcion;

        return $this;
    }

    /**
     * Get miniDescripcion
     *
     * @return string 
     */
    public function getMiniDescripcion()
    {
        return $this->miniDescripcion;
    }

    /**
     * Set puntosOtros
     *
     * @param integer $puntosOtros
     * @return Exppromociones
     */
    public function setPuntosOtros($puntosOtros)
    {
        $this->puntosOtros = $puntosOtros;

        return $this;
    }

    /**
     * Get puntosOtros
     *
     * @return integer 
     */
    public function getPuntosOtros()
    {
        return $this->puntosOtros;
    }

    /**
     * Set flujoCanje
     *
     * @param string $flujoCanje
     * @return Exppromociones
     */
    public function setFlujoCanje($flujoCanje)
    {
        $this->flujoCanje = $flujoCanje;

        return $this;
    }

    /**
     * Get flujoCanje
     *
     * @return string 
     */
    public function getFlujoCanje()
    {
        return $this->flujoCanje;
    }

    /**
     * Set categoria
     *
     * @param \WORK2\WORK\SitioExperience\FrontendBundle\Entity\ExpCategorias $categoria
     * @return Exppromociones
     */
    public function setCategoria(\WORK2\WORK\SitioExperience\FrontendBundle\Entity\ExpCategorias $categoria = null)
    {
        $this->categoria = $categoria;

        return $this;
    }

    /**
     * Get categoria
     *
     * @return \WORK2\WORK\SitioExperience\FrontendBundle\Entity\ExpCategorias 
     */
    public function getCategoria()
    {
        return $this->categoria;
    }

    /**
     * Set banner
     *
     * @param \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $banner
     * @return Exppromociones
     */
    public function setBanner(\WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $banner = null)
    {
        $this->banner = $banner;

        return $this;
    }

    /**
     * Get banner
     *
     * @return \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes 
     */
    public function getBanner()
    {
        return $this->banner;
    }

    /**
     * Set imagen
     *
     * @param \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $imagen
     * @return Exppromociones
     */
    public function setImagen(\WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $imagen = null)
    {
        $this->imagen = $imagen;

        return $this;
    }

    /**
     * Get imagen
     *
     * @return \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes 
     */
    public function getImagen()
    {
        return $this->imagen;
    }

    /**
     * Set comercio
     *
     * @param \WORK2\WORK\SitioExperience\FrontendBundle\Entity\expcomercios $comercio
     * @return Exppromociones
     */
    public function setComercio(\WORK2\WORK\SitioExperience\FrontendBundle\Entity\expcomercios $comercio = null)
    {
        $this->comercio = $comercio;

        return $this;
    }

    /**
     * Get comercio
     *
     * @return \WORK2\WORK\SitioExperience\FrontendBundle\Entity\expcomercios 
     */
    public function getComercio()
    {
        return $this->comercio;
    }

    /**
     * Set nombreReal
     *
     * @param string $nombreReal
     * @return ExpPromociones
     */
    public function setNombreReal($nombreReal)
    {
        $this->nombreReal = $nombreReal;

        return $this;
    }

    /**
     * Get nombreReal
     *
     * @return string 
     */
    public function getNombreReal()
    {
        return $this->nombreReal;
    }

    /**
     * Set descripcionExperience
     *
     * @param string $descripcionExperience
     * @return ExpPromociones
     */
    public function setDescripcionExperience($descripcionExperience)
    {
        $this->descripcionExperience = $descripcionExperience;

        return $this;
    }

    /**
     * Get descripcionExperience
     *
     * @return string 
     */
    public function getDescripcionExperience()
    {
        return $this->descripcionExperience;
    }
    /**
     * @var integer
     */
    private $orden = 0;


    /**
     * Set orden
     *
     * @param integer $orden
     * @return Exppromociones
     */
    public function setOrden($orden)
    {
        $this->orden = $orden;

        return $this;
    }

    /**
     * Get orden
     *
     * @return integer 
     */
    public function getOrden()
    {
        return $this->orden;
    }

    /**
     * Determina si la promoción es un viaje genérico,
     * según las condición:
     * - $flujoCanje de la instancia debe ser igual al string 'generico', y
     * - Id de la categoría asociada debe ser igual a 2 (Viajes)
     * 
     * "Opción Genérico": Es una promoción canjeable de tipo Viaje, 
     * en la que el usuario puede determinar cuántos puntos utilizar.
     * 
     * @return boolean
     */
    public function esOpcionGenerica()
    {
        $categorias = $this->getCategorias();
        $flujoCanje = $this->getFlujoCanje();
        $esViaje=false;
        foreach($categorias as $categoria){
            if($categoria->getId() == 2){
                $esViaje = true;
                break;
            }
        }
        // Comparar cadenas.
        // "strcasecmp: Binary safe case-insensitive string comparison".
        // retorna 0 si las cadenas son iguales, ignorando mayusculas.
        $esGenerico = strcasecmp($flujoCanje, 'generico') == 0;

        return $esViaje && $esGenerico;

    }

    /**
     * Determina si la promoción es un viaje
     * según las condición:
     * - Id de la categoría asociada debe ser igual a 2 (Viajes)
     *
     * @return boolean
     */
    public function esViaje()
    {
        $categorias = $this->getCategorias();
        $esViaje=false;
        foreach($categorias as $categoria){
            if($categoria->getId() == 2){
                $esViaje = true;
                break;
            }
        }

        return $esViaje;

    }

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->imagenes = new \Doctrine\Common\Collections\ArrayCollection();
        $this->categorias = new \Doctrine\Common\Collections\ArrayCollection();
        $this->etiquetas = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get imagenes
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getImagenes()
    {
        return $this->imagenes;
    }

    /**
     * Set destacado
     *
     * @param boolean $destacado
     * @return Exppromociones
     */
    public function setDestacado($destacado)
    {
        $this->destacado = $destacado;

        return $this;
    }

    /**
     * Get destacado
     *
     * @return boolean 
     */
    public function getDestacado()
    {
        return $this->destacado;
    }

    /**
     * Add categorias
     *
     * @param \WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expcategorias $categorias
     * @return Exppromociones
     */
    public function addCategoria(\WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expcategorias $categorias)
    {
        $this->categorias[] = $categorias;

        return $this;
    }

    /**
     * Remove categorias
     *
     * @param \WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expcategorias $categorias
     */
    public function removeCategoria(\WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expcategorias $categorias)
    {
        $this->categorias->removeElement($categorias);
    }

    /**
     * Get categorias
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getCategorias()
    {
        return $this->categorias;
    }


    /**
     * Add imagenes
     *
     * @param \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $imagenes
     * @return Exppromociones
     */
    public function addImagene(\WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $imagenes)
    {
        $this->imagenes[] = $imagenes;

        return $this;
    }

    /**
     * Remove imagenes
     *
     * @param \WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $imagenes
     */
    public function removeImagene(\WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes $imagenes)
    {
        $this->imagenes->removeElement($imagenes);
    }

    /**
     * Add etiquetas
     *
     * @param \WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expetiquetas $etiquetas
     * @return Exppromociones
     */
    public function addEtiqueta(\WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expetiquetas $etiquetas)
    {
        $this->etiquetas[] = $etiquetas;

        return $this;
    }

    /**
     * Remove etiquetas
     *
     * @param \WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expetiquetas $etiquetas
     */
    public function removeEtiqueta(\WORK2\WORK\SitioExperience\FrontendBundle\Entity\Expetiquetas $etiquetas)
    {
        $this->etiquetas->removeElement($etiquetas);
    }

    /**
     * Get etiquetas
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getEtiquetas()
    {
        return $this->etiquetas;
    }

    /**
     * Set fechaFinNovedad
     *
     * @param \DateTime $fechaFinNovedad
     * @return Exppromociones
     */
    public function setFechaFinNovedad($fechaFinNovedad)
    {
        $this->fechaFinNovedad = $fechaFinNovedad;

        return $this;
    }

    /**
     * Get fechaFinNovedad
     *
     * @return \DateTime 
     */
    public function getFechaFinNovedad()
    {
        return $this->fechaFinNovedad;
    }

    /**
     * Set cantidadVista
     *
     * @param integer $cantidadVista
     * @return Exppromociones
     */
    public function setCantidadVista($cantidadVista)
    {
        $this->cantidadVista = $cantidadVista;

        return $this;
    }

    /**
     * Get cantidadVista
     *
     * @return integer 
     */
    public function getCantidadVista()
    {
        return $this->cantidadVista;
    }

    /**
     * Set cantidadCanjeada
     *
     * @param integer $cantidadCanjeada
     * @return Exppromociones
     */
    public function setCantidadCanjeada($cantidadCanjeada)
    {
        $this->cantidadCanjeada = $cantidadCanjeada;

        return $this;
    }

    /**
     * Get cantidadCanjeada
     *
     * @return integer 
     */
    public function getCantidadCanjeada()
    {
        return $this->cantidadCanjeada;
    }

    /**
     * Set valorGuaranies
     *
     * @param integer $valorGuaranies
     * @return Exppromociones
     */
    public function setValorGuaranies($valorGuaranies)
    {
        $this->valorGuaranies = $valorGuaranies;

        return $this;
    }

    /**
     * Get valorGuaranies
     *
     * @return integer 
     */
    public function getValorGuaranies()
    {
        return $this->valorGuaranies;
    }

    /**
     * Set puntosTelefonico
     *
     * @param integer $puntosTelefonico
     * @return Exppromociones
     */
    public function setPuntosTelefonico($puntosTelefonico)
    {
        $this->puntosTelefonico = $puntosTelefonico;

        return $this;
    }

    /**
     * Get puntosTelefonico
     *
     * @return integer 
     */
    public function getPuntosTelefonico()
    {
        return $this->puntosTelefonico;
    }

    /**
     * Set texto_circulo
     *
     * @param string $textoCirculo
     * @return Exppromociones
     */
    public function setTextoCirculo($textoCirculo)
    {
        $this->texto_circulo = $textoCirculo;

        return $this;
    }

    /**
     * Get texto_circulo
     *
     * @return string 
     */
    public function getTextoCirculo()
    {
        return $this->texto_circulo;
    }

    public function __toString()
    {
        return $this->getNombre();
    }

    /**
     * Set mostrarValorGuaranies
     *
     * @param boolean $mostrarValorGuaranies
     * @return Exppromociones
     */
    public function setMostrarValorGuaranies($mostrarValorGuaranies)
    {
        $this->mostrarValorGuaranies = $mostrarValorGuaranies;

        return $this;
    }

    /**
     * Get mostrarValorGuaranies
     *
     * @return boolean 
     */
    public function getMostrarValorGuaranies()
    {
        return $this->mostrarValorGuaranies;
    }
}

此实体Exppromociones具有属性$imagenes,该属性具有另一个实体Imagenes的实例 Imagenes.php

<?php

namespace WORK2\WORK\SitioUniversos\ImagenesBundle\Entity;

use Iphp\FileStoreBundle\Mapping\Annotation as FileStore;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * Imagenes
 *
 * @ORM\Table(name="imagenes")
 * @ORM\Entity
 * @FileStore\Uploadable
 */
class Imagenes
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * 
     * @ORM\Column(name="Nombre", type="string", length=255)
     */
    private $nombre;


    /**
     * @var \Datetime
     * 
     * @ORM\Column(name="Fecha_Carga", type="date")
     */
    private $fechaCarga;

    /**
     * @ORM\Column(name="Enlace", type="array")
     * @Assert\File( maxSize="20M")
     * @FileStore\UploadableField(mapping="imagenes")
     **/
    private $enlace;

    /**
     * @var string
     *
     * @ORM\Column(name="Tipo", type="string", length=255)
     */
    private $tipo;

    /**
     * @var string
     *
     * @ORM\Column(name="Link", type="string", length=255)
     */
    private $link;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Imagenes
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Set fechaCarga
     *
     * @param \DateTime $fechaCarga
     * @return Imagenes
     */
    public function setFechaCarga($fechaCarga)
    {
        $this->fechaCarga = $fechaCarga;

        return $this;
    }

    /**
     * Get fechaCarga
     *
     * @return \DateTime 
     */
    public function getFechaCarga()
    {
        return $this->fechaCarga;
    }

    /**
     * Set enlace
     *
     * @param array $enlace
     * @return Imagenes
     */
    public function setEnlace($enlace)
    {
        $this->enlace = $enlace;

        return $this;
    }

    /**
     * Get enlace
     *
     * @return array 
     */
    public function getEnlace()
    {
        return $this->enlace;
    }

    public function __toString()
    {
        return $this->getNombre();
    }

    /**
     * Set tipo
     *
     * @param string $tipo
     * @return Imagenes
     */
    public function setTipo($tipo)
    {
        $this->tipo = $tipo;

        return $this;
    }

    /**
     * Get tipo
     *
     * @return string 
     */
    public function getTipo()
    {
        return $this->tipo;
    }

    /**
     * Set link
     *
     * @param string $link
     * @return Imagenes
     */
    public function setLink($link)
    {
        $this->link = $link;

        return $this;
    }

    /**
     * Get link
     *
     * @return string
     */
    public function getLink()
    {
        return $this->link;
    }

    public function __construct(){
        $this->fechaCarga = new \DateTime();
    }
}

我想查看Imagenes中与Exppromociones没有关联的所有图像

映射:

WORK2\WORK\SitioExperience\FrontendBundle\Entity\Exppromociones:
type: entity
table: exppromociones
indexes:
    IDX_4EE4A008763C8AA7:
        columns:
            - imagen_id
    IDX_4EE4A008684EC833:
        columns:
            - banner_id
    IDX_4EE4A0083397707A:
        columns:
            - categoria_id
    IDX_COMERCIOS_PROMOCION:
        columns:
            - comercio_id
id:
    id:
        type: integer
        nullable: false
        unsigned: false
        comment: ''
        id: true
        generator:
            strategy: IDENTITY
fields:
...
...
manyToMany:                     
    imagenes:
        cascade: ["persist","remove"]
        targetEntity: WORK2\WORK\SitioUniversos\ImagenesBundle\Entity\Imagenes
        joinTable:
            name: imagenes_x_exppromociones
            joinColumns:
                id_promocion:
                    referencedColumnName: id
            inverseJoinColumns:
                id_imagen:
                    referencedColumnName: id
                    unique: true   
lifecycleCallbacks: {  }

1 个答案:

答案 0 :(得分:0)

此职位需要更多信息,所以这是一个命中/未命中类型的答案:

img_pro.image_id看起来很可疑。

DQL使用属性名称,而不使用字段名称,因此应为img_pro.image