Doctrine join + ublaboo/datagrid
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- jonyssss
- Člen | 3
Ahoj,
snažím se hezky vyřešit jednu věc a řešení, které funguje, mi nepřijde
úplně ideální. Jedná se o aukční systém kde chci udělat výpis
položek, na které daný uživatel udělal příhoz. Níže posílám entity a
vytvoření gridu na které jsem přišel. Na tom řešení se mi nelíbí, že
datagrid vykoná hezký příkaz do db kde se joinou obě tabulky ze kterých
chci data ale pak se znova dotahujou data po jednom když se vypisuje název
položky. Nenapadá někoho jiné řešení? Díky za tipy
/**
* @ORM\Entity
*/
class Item {
use \Kdyby\Doctrine\Entities\MagicAccessors;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=64, nullable=false)
*/
protected $name;
/**
* @ORM\OneToMany(targetEntity="Bid", mappedBy="item_id")
*/
protected $bids;
public function __construct() {
$this->bids = new ArrayCollection();
}
}
/**
* @ORM\Entity
*/
class Bid {
use \Kdyby\Doctrine\Entities\MagicAccessors;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
public $id;
/**
* @var float
*
* @ORM\Column(name="price", type="float", nullable=false)
*/
public $price;
/**
* @ORM\ManyToOne(targetEntity="Item", inversedBy="bids")
* @ORM\JoinColumn(name="item_id", referencedColumnName="id", nullable=FALSE)
*/
public $item;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=FALSE)
*/
public $user;
}
/**
* @ORM\Entity
*/
class User {
use \Kdyby\Doctrine\Entities\MagicAccessors;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=64, nullable=false)
*/
protected $name;
}
$g = new \Ublaboo\DataGrid\DataGrid();
$b = $this->em->createQueryBuilder();
$b->select(['b'])
->from(\App\Bid::class, 'b')
->join(\App\Item::class, 'i', \Doctrine\ORM\Query\Expr\Join::WITH, 'i.id = b.item')
->whereCriteria(['b.user' => 1]);
$g->setDataSource($b);
$g->addColumnText('name', 'Název položky', 'item.name')->setFilterText('i.name');
$g->addColumnText('price', 'Cena');
return $g;
- David Matějka
- Moderator | 6445
$b->select('b, i')
->from(\App\Bid::class, 'b')
->join('b.item', 'i')
->whereCriteria(['b.user' => 1]);