See editing at the end for an updated question about ResultSetMapping
I have two entities defined (Item and ItemType), one of which has ManyToOne associated with the other. I have quite a lot of my own queries due to the complexity of generating a search for the correct elements. These queries always return all columns of the first object (SELECT. * ... elements).
I found that my associations are always null for the first element, and I'm not sure what I'm doing wrong. Any help would be appreciated.
Entities:
namespace AppBundle\Entity;
use Psr\Log\LoggerInterface;
use Doctrine\ORM\Mapping as ORM;
class Item {
private $id;
private $accountId;
private $itemType;
}
ItemType
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
class ItemType {
private $id;
private $accountId;
private $name;
}
getItem ItemRepository. , SELECT items.* FROM items ... getEntityManager()->createNativeQuery($sql, $rsm);
namespace AppBundle\Entity;
use Psr\Log\LoggerInterface;
use Doctrine\ORM\Query\ResultSetMapping;
class ItemRepository extends \Doctrine\ORM\EntityRepository
{
protected $logger;
protected $itemTypes;
protected $itemValues;
protected $fields;
public function initService(LoggerInterface $logger,
ItemTypeRepository $itemTypes,
ItemValueRepository $itemValues,
FieldRepository $fields)
{
$this->logger = $logger;
$this->itemTypes = $itemTypes;
$this->itemValues = $itemValues;
$this->fields = $fields;
}
public function getItem($accountId, $itemId, $restrictedUserOwnerItemType, $restrictedUserOwnerItemId)
{
$this->logger->debug(__METHOD__.'::params::'.json_encode(['accountId' => $accountId, 'itemId' => $itemId,
'restrictedUserOwnerItemType' => $restrictedUserOwnerItemType, 'restrictedUserOwnerItemId' => $restrictedUserOwnerItemId]));
if(!$accountId || !$itemId || !is_numeric($restrictedUserOwnerItemType) || !is_numeric($restrictedUserOwnerItemId))
throw new \InvalidArgumentException('getItem requires accountId, itemId, restrictedUserOwnerItemType and restrictedUserOwnerItemId');
$sql = "SELECT items.*, ".
"item_types.id AS item_type_id, ".
"item_types.account_id AS item_type_account_id, ".
"item_types.name AS item_type_name, ".
"item_types.plural_name AS item_type_name, ".
"item_types.label AS item_type_label, ".
"item_types.plural_label AS item_type_plural_label, ".
"item_types.are_users AS item_type_are_users, ".
"item_types.own_users AS item_type_own_users ".
"FROM items ".
"JOIN item_types ON item_types.id = items.item_type_id ";
$isRestrictedUser = $restrictedUserOwnerItemType != 0 || $restrictedUserOwnerItemId != 0;
if($isRestrictedUser)
{
$sql .= <<<SQL
WHERE item_types.visible_to_restricted_users = 1
SQL;
$sql .= <<<SQL
AND items.id IN ( /* Where Item Belongs to Same Owner */
SELECT item_id
FROM item_values
JOIN fields ON fields.id = item_values.field_id
JOIN items ON items.id = item_values.item_id AND item_values.ver = items.ver
JOIN item_types ON item_types.id = items.item_type_id
WHERE item_values.value = ?
AND fields.field_type = "Relationship"
AND fields.field_item_type_id = ?)
SQL;
$params[] = $restrictedUserOwnerItemId;
$params[] = $restrictedUserOwnerItemType;
$sql .= "AND ";
} else {
$sql .= "WHERE ";
}
$sql .= "items.account_id = ? AND items.id = ? ";
$params[] = $accountId;
$params[] = $itemId;
$rsm = $this->standardResultSetMapping();
echo $sql;
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$query->setParameters($params);
$result = array();
foreach($query->getResult() as $row) {
$row->initServiceEntity($this->logger, $this, $this->itemValues, $this->fields);
$result[] = $row;
}
if(!$result || count($result) == 0)
throw new \InvalidArgumentException("Item could not be located for Item #".$itemId.". You may not have permission to view this item or it may not exist.");
else
{
return $result[0];
}
}
private function standardResultSetMapping()
{
$rsm = new ResultSetMapping();
$rsm->addEntityResult('\AppBundle\Entity\Item', 'items');
$rsm->addEntityResult('\AppBundle\Entity\ItemType', 'item_types');
$rsm->addFieldResult('items', 'id', 'id');
$rsm->addFieldResult('items', 'account_id', 'accountId');
$rsm->addFieldResult('items', 'field_count', 'fieldCount');
$rsm->addFieldResult('items', 'ver', 'ver');
$rsm->addFieldResult('items', 'title', 'title');
$rsm->addMetaResult('items', 'item_type_id', 'item_type_id', true);
$rsm->addFieldResult('item_types', 'item_type_id', 'id');
$rsm->addFieldResult('item_types', 'item_type_name', 'name');
$rsm->addFieldResult('item_types', 'item_type_plural_name', 'pluralName');
$rsm->addFieldResult('item_types', 'item_type_label', 'label');
$rsm->addFieldResult('item_types', 'item_type_plural_label','pluralLabel');
$rsm->addFieldResult('item_types', 'item_type_are_users', 'areUsers');
$rsm->addFieldResult('item_types', 'item_type_own_users', 'ownUsers');
return $rsm;
}
}
Item , null itemType:
Item {#548 βΌ
-id: 23
-accountId: 1
-itemType: null
-fieldCount: 4
-ver: 1451940837
-title: "New Item"
#fields: []
#itemValues: []
#cacheValues: []
#logger: Logger {
#itemsRepository: ItemRepository {
#itemValuesRepository: ItemValueRepository {
#fieldsRepository: FieldRepository {
#loaded: true
#changeCount: 0
}
item_types
id account_id name plural_name label plural_label are_users own_users
31 1 task tasks Task Tasks 1 0
id account_id item_type_id field_count ver title
23 1 31 4 1451940837 New Item
, , ResultSetMapping. . , ( ItemType - ):
object(AppBundle\Entity\Item)[560]
private 'id' => int 23
private 'accountId' => int 1
private 'itemType' => null
private 'fieldCount' => int 4
private 'ver' => int 1451940837
private 'title' => string 'New Item' (length=8)
protected 'fields' =>
array (size=0)
empty
protected 'itemValues' =>
array (size=0)
empty
protected 'cacheValues' =>
array (size=0)
empty
protected 'logger' => null
protected 'itemsRepository' => null
protected 'itemValuesRepository' => null
protected 'fieldsRepository' => null
protected 'loaded' => boolean false
protected 'changeCount' => int 0
object(AppBundle\Entity\ItemType)[507]
private 'id' => int 31
private 'accountId' => int 1
private 'name' => string 'task' (length=4)
private 'pluralName' => string 'tasks' (length=5)
private 'label' => string 'Task' (length=4)
private 'pluralLabel' => string 'Tasks' (length=5)
private 'areUsers' => boolean true
private 'ownUsers' => boolean false
, :
ResultSetMapping , Entity ?