Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter limits and manipulate rendercell #980

Open
FredDut opened this issue Oct 17, 2017 · 0 comments
Open

Filter limits and manipulate rendercell #980

FredDut opened this issue Oct 17, 2017 · 0 comments

Comments

@FredDut
Copy link
Contributor

FredDut commented Oct 17, 2017

Hello,
I have three entities with ManytoOne/OneToMany relations:

class Projet {
	
       /**
	 *
	 * @var string $nom @GRID\Column(title="Nom")
	 *      @ORM\Column(name="nom", type="string", length=255, nullable=false)
	 */
	private $nom;
         /**
	 * @GRID\Column(title="Domaine", field="domaine.nom")
	 * 
	 * @var domaine @ORM\ManyToOne(targetEntity="AppBundle\Entity\Domaine", inversedBy="projets")
	 *      @ORM\JoinColumns({
	 *      @ORM\JoinColumn(name="id_domaine", referencedColumnName="id")
	 *      })
	 */
	private $domaine;

         /**
	 *
	 * @var applis @ORM\OneToMany(targetEntity="Appli", mappedBy="projet", cascade={"persist"})
	 */
	private $applis;

To render ManytoOne relations in a pretty way, I use TextColumn with querybuilder.

		$grid = $this->get ( 'grid' );
		$source->initQueryBuilder($em->createQueryBuilder()
				-> select ('DISTINCT p')
				-> from('AppBundle:Projet', 'p')
				->orderBy('p.nom'));
		$grid->setSource ( $source );
		$grid->setId('index_projets');
$applisColumn= new TextColumn(array('id'=>'applis',
		    'field'=>'applis.nom',
		    'title'=>'Applis,
		    'source'=>true,
		    'filterable'=>true,'sortable'=>true )) ;
		$applisColumn->manipulateRenderCell  (
				function ($value,$row, $router) use ($em) {
					$qb = $em->createQueryBuilder()
					-> select ('g.nom')
					-> from('AppBundle:Projet', 'p')
					->leftjoin('p.applis','g')
					->where('p =:id')
					->setParameter('id', $row->getField('id') )
					;
					$applis='';
					return $qb->getQuery ()->getArrayResult();
					foreach ($qb->getQuery ()->getArrayResult() as $n=>$g) {
						foreach ($g as $l=>$nom) {
							if($applis) $applis.="\n";
							$applis.=$nom;
						}
					}
					return $applis;
				}) ;
		$grid->addColumn($applisColumn);
		$grid->hideColumns(array('domaine.nom'));
		$domaineColumn= new TextColumn(array('id'=>'domaine',
		    'field'=>'domaine.nom',
		    'title'=>'Domaine',
		    'source'=>true,'filterable'=>true,'sortable'=>true )) ;
		$domaineColumn->manipulateRenderCell  (
				function ($value,$row, $router) use ($em) {

					$projet=$em->getRepository ( 'AppBundle:Projet')->find($row->getField('id'));
					if ($projet->getDomaine()){
						return $projet->getDomaine()->getNom();
					}
					return null;
					}) ;
		$grid->addColumn($domaineColumn, 3);
		$grid->setLimits ( array (
				10,
				20,
				100
		) );

That's OK. But when I filter, the datagrid run a first query with 2 left join and limit 10:

SELECT DISTINCT p0_.id AS id_0, d1_.nom AS nom_1, d1_.nom AS nom_2, a2_.nom AS nom_3, p0_.nom AS nom_4 FROM projet p0_ LEFT JOIN domaine d1_ ON p0_.id_domaine = d1_.id LEFT JOIN appli a2_ ON p0_.id = a2_.id_projet WHERE LOWER(p0_.nom) LIKE LOWER(?) ORDER BY p0_.nom ASC LIMIT 10

The next query is limited to this 10 id.
So, if there are several applis for a projet, not all relevant results are shown.

Is there a way to change the first query? (may be remove the left join with appli)

Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant