Mam pewien problem.
Posiadam w encje Gallery i GalleryImage:
Gallery:
/**
* Meritoo\Cmf\GalleryBundle\Entity\Gallery
*
* @ORM\Table(name="cmf_gallery")
* @ORM\Entity(repositoryClass="Meritoo\Cmf\GalleryBundle\Repository\GalleryRepository")
*/
class Gallery implements Translatable {
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $title
*
* @ORM\Column(name="title", type="string", length="100")
* @Gedmo\Translatable
*/
private $title;
/**
* @var string $title_slug
*
* @ORM\Column(name="title_slug", type="string", length="100")
* @Gedmo\Slug(fields={"title"})
* @Gedmo\Translatable
*/
private $title_slug;
/**
* @var text $description
*
* @ORM\Column(name="description", type="text", nullable="true")
* @Gedmo\Translatable
*/
private $description;
/**
*
* @var integer $position
*
* @ORM\Column(name="position", type="smallint", nullable="true")
*/
private $position;
/**
* @var datetime $created_at
*
* @ORM\Column(name="created_at", type="datetime")
* @Gedmo\Timestampable(on="create")
*/
private $created_at;
/**
* @var datetime $updated_at
*
* @ORM\Column(name="updated_at", type="datetime", nullable="true")
* @Gedmo\Timestampable(on="update")
*/
private $updated_at;
/**
* @var datetime $deleted_at
*
* @ORM\Column(name="deleted_at", type="datetime", nullable="true")
*/
private $deleted_at;
/**
* @ORM\OneToMany(targetEntity="GalleryImage", mappedBy="gallery")
*/
private $images;
/**
* The department, branch of the company / institution
*
* @ORM\ManyToOne(targetEntity="Meritoo\Cmf\DepartmentBundle\Entity\Department", inversedBy="galleries")
* @ORM\JoinColumn(name="department_id", referencedColumnName="id")
*
* @var \Meritoo\Cmf\DepartmentBundle\Entity\Department
*/
private $department;
/**
* The locale value (language code), e.g. pl_PL.
* This is not a mapped field of entity metadata, just a simple property.
*
* @var string
* @Gedmo\Locale
*/
private $locale;
GalleryImage:
/**
* Meritoo\Cmf\GalleryBundle\Entity\GalleryImage
*
* @ORM\Table(name="cmf_gallery_images")
* @ORM\Entity(repositoryClass="Meritoo\Cmf\GalleryBundle\Repository\GalleryImageRepository")
* @ORM\HasLifecycleCallbacks
*/
class GalleryImage implements Translatable {
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $title
*
* @Gedmo\Translatable
* @ORM\Column(name="title", type="string", length="50")
*/
private $title;
/**
* @var string $file_name
*
* @ORM\Column(name="file_name", type="string", length="100")
*/
private $file_name;
/**
*
* @var integer $position
*
* @ORM\Column(name="position", type="smallint", nullable="true")
*/
private $position;
/**
* @var boolean $is_main
*
* @ORM\Column(name="is_main", type="boolean")
*/
private $is_main = false;
/**
* @var datetime $created_at
*
* @ORM\Column(name="created_at", type="datetime")
* @Gedmo\Timestampable(on="create")
*/
private $created_at;
/**
* @var datetime $updated_at
*
* @ORM\Column(name="updated_at", type="datetime", nullable="true")
* @Gedmo\Timestampable(on="update")
*/
private $updated_at;
/**
* @var datetime $deleted_at
*
* @ORM\Column(name="deleted_at", type="datetime", nullable="true")
*/
private $deleted_at;
/**
* @ORM\ManyToOne(targetEntity="Gallery", inversedBy="images")
* @ORM\JoinColumn(name="gallery_id", referencedColumnName="id")
*
* @var \Meritoo\Cmf\GalleryBundle\Entity\Gallery
*/
private $gallery;
/**
* @Assert\File(maxSize="6000000")
* @var \Symfony\Component\HttpFoundation\File\UploadedFile
*/
private $file;
/**
* Helper for uploading.
* Used for upload operations etc.
*
* @var \Meritoo\Cmf\CommonBundle\Helper\UploadHelper
*/
private $uploadHelper;
/**
* The locale value (language code), e.g. pl_PL.
* This is not a mapped field of entity metadata, just a simple property.
*
* @var string
* @Gedmo\Locale
*/
private $locale;
Musze pobrac za pomoja 1 zapytania wszystkie galerie ktore posiadaja przynajmniej 1 zdjecie, czyli pomijamy wszystkie puste galerie.
Mam metode w repository:
/**
* Returns all galleries
*
* @param [integer $limit = 0] Maximum amount of items
* @param [integer $offset = 0] The start position, offset
* @param [boolean $skipEmpty = false] if is set to true galleries without images are skipped. Otherwise not.
* @return array
*/
public function getGalleries($limit = 0, $offset = 0, $skipEmpty = false) {
if (!$skipEmpty) {
'position' => 'ASC',
'created_at' => 'DESC'
);
$criteria = $this->getCriteriaParameters();
$galleries = $this->getResult($criteria, $orderBy, $limit, $offset);
} else {
$skipEmptyGalleriesSubQuery = $this->createQueryBuilder('g')
->select('g.id')
->leftJoin('g.images', 'i', \Doctrine\ORM\Query\Expr\
Join::WITH, 'i.deleted_at is null') ->where('g.deleted_at is null')
->andWhere('i.id is not null')
->groupBy('g.id')
->getDQL();
$queryBuilder = $this->createQueryBuilder('c');
$queryBuilder->where($queryBuilder->expr()->in('c.id', $skipEmptyGalleriesSubQuery))
->orderBy('c.position', 'ASC')
->addOrderBy('c.created_at', 'DESC');
if ($limit > 0) {
$queryBuilder->setMaxResults($limit);
}
if ($offset > 0) {
$queryBuilder->setFirstResult($offset);
}
$galleries = $queryBuilder->getQuery()->getResult();
}
return $galleries;
}
W czym problem.
Mianowicie, zapytanie subquery wyglada dobrze zwraca mi id galeri ktore maja przynajmniej 1 zdjecie.
Glowne zapytanie zwraca mi kolumny(obiekt Gallery) dla nie pustych galerii sprawdzalem w phpmyadmin.
Jednak w "kodzie" zwraca obiekty ale z pustymi wlasciwosciami.
Jedyna metoda z Encji ktora nie zwraca pustej wartosci to:
//przyklad opiera sie o foreach() dla wartosci ktora zwraca getGalleries()
print $entity->getId(); //ok print $entity->getTitle(); //i tu juz jest pusto mamy pusty string
I tak samo jesli chodzi o wszystkie inne pola.
Czy ktos wie gdzie moze byc problem?
Tak wyglada wygenerowane zapytanie:
SELECT c0_.id AS id0, c0_.title AS title1, c0_.title_slug AS title_slug2, c0_.description AS description3, c0_.position AS position4, c0_.created_at AS created_at5, c0_.updated_at AS updated_at6, c0_.deleted_at AS deleted_at7, c0_.department_id AS department_id8
FROM cmf_gallery c0_
WHERE c0_.id
IN (
SELECT c1_.id
FROM cmf_gallery c1_
LEFT JOIN cmf_gallery_images c2_ ON c1_.id = c2_.gallery_id
AND (
c2_.deleted_at IS NULL
)
WHERE c1_.deleted_at IS NULL
AND c2_.id IS NOT NULL
GROUP BY c1_.id
)
ORDER BY c0_.position ASC , c0_.created_at DESC
LIMIT 3