I am sorry, whole problem was in wrong @Id definition in DgmTypeAttribute 
object.

Thank you for your help,
Miroslav Misek

Dne pátek, 27. prosince 2013 14:47:39 UTC+1 Herman Peeren napsal(a):
>
> If you have a many-to-one relationship between dgmTypeAttributes and 
> dgmAttributeTypes via the attributeID column and
> if you make two entities from those two tables called DgmTypeAttribute and 
> DgmAttributeType (I think the names could be more clear), 
> then you would have an attributeType-field in your 
> DgmTypeAttribute-entity, which holds a DgmAttributeType-entity.
>
> With annotations:
> /** @Entity **/
> class DgmTypeAttribute
> {
>     // ...
>
>     /**
>      * @ManyToOne(targetEntity="DgmAttributeType", 
> inversedBy="typeAttributes")
>      * @JoinColumn(name="attributeID", referencedColumnName="attributeID")
>      **/
>     private $attributeType;
>     
>     // ...
> }
>
> The DgmAttributeType-entity would (if it is a bi-directional mapped 
> relationship) then contain a typeAttributes-field (note the plural!), which 
> contains a collection of DgmTypeAttribute-entities. 
>
> With annotations:
> /** @Entity **/
> class DgmAttributeType
> {
>     // ...    
>     
>     /**
>      * @OneToMany(targetEntity="DgmTypeAttribute", 
> mappedBy="attributeType")
>      **/
>     private $typeAttributes;
>     
>     // ...    
>     
>     public function __construct()
>     {
>         $this->typeAttributes = new 
> \Doctrine\Common\Collections\ArrayCollection();
>     }
>
> }
> Note: no attributeID-field in the entities.
>
> Now in your DQL you can do:
>
> $query = $qb->select('ta', 'at')
>                    ->from('EveStatic\Entity\DgmTypeAttribute', 'ta')
>                    ->Join('*ta.attributeType*', 'at')
>                    ->where('ta.typeID = :typeID')
>                    ->setParameter('typeID', $this->typeID)
>                    ->getQuery();
>
> This would be the same with ArticleID instead of TypeID, Comment instead 
> of DgmTypeAttribute and User instead of DgmAttributeType.
>
> Hope this helps.Have to leave now; back tomorrow.
> Herman
>
>
> On Friday, 27 December 2013 12:10:15 UTC+1, [email protected] wrote:
>>
>> Here are those two tables:
>>
>> mysql> explain dgmTypeAttributes;
>> +-------------+-------------+------+-----+---------+-------+
>> | Field       | Type        | Null | Key | Default | Extra |
>> +-------------+-------------+------+-----+---------+-------+
>> | typeID      | int(11)     | NO   | PRI | NULL    |       |
>> | attributeID | smallint(6) | NO   | PRI | NULL    |       |
>> | valueInt    | int(11)     | YES  |     | NULL    |       |
>> | valueFloat  | double      | YES  |     | NULL    |       |
>> +-------------+-------------+------+-----+---------+-------+
>> 4 rows in set (0.00 sec)
>>
>> mysql> explain dgmAttributeTypes;
>> +---------------+---------------------+------+-----+---------+-------+
>> | Field         | Type                | Null | Key | Default | Extra |
>> +---------------+---------------------+------+-----+---------+-------+
>> | attributeID   | smallint(6)         | NO   | PRI | NULL    |       |
>> | attributeName | varchar(100)        | YES  |     | NULL    |       |
>> | description   | varchar(1000)       | YES  |     | NULL    |       |
>> | iconID        | smallint(6)         | YES  | MUL | NULL    |       |
>> | defaultValue  | double              | YES  |     | NULL    |       |
>> | published     | tinyint(1)          | YES  |     | NULL    |       |
>> | displayName   | varchar(100)        | YES  |     | NULL    |       |
>> | unitID        | tinyint(3) unsigned | YES  | MUL | NULL    |       |
>> | stackable     | tinyint(1)          | YES  |     | NULL    |       |
>> | highIsGood    | tinyint(1)          | YES  |     | NULL    |       |
>> | categoryID    | tinyint(3) unsigned | YES  | MUL | NULL    |       |
>> +---------------+---------------------+------+-----+---------+-------+
>> 11 rows in set (0.00 sec)
>>
>>
>> So it is one-to-many relation.
>>
>> Generated query seems to be correct, because it returns correct data when 
>> i run it directly at mysql command line.
>>
>> I know i could use php associations, and access attributetype thru 
>> typeattribute->typeID. But later I will need many more associated objects 
>> (tables), so I am trying to load them this way.
>>
>> It is same as with article comments. Where you have Article, Comment and 
>> User objects. Now i have article id and trying to find all comments with 
>> their users (authors) for it, without loading article object (just using 
>> its id). And it returns just first object. Marco said it is correct 
>> behavior. So i am looking for another way to do it.
>>
>> I hope I explained it correctly and clearly now.
>>
>> Thanks,
>> Miroslav Misek
>>
>> Dne pátek, 27. prosince 2013 11:48:10 UTC+1 Herman Peeren napsal(a):
>>>
>>> *First: *
>>> your  model is not clear to me. You have types and attributes and you 
>>> want a many-to-many relationship between those two? So: a type can have 
>>> multiple attributes and an attribute can have multiple types? Then you 
>>> should make a Type entity and an Attribute entity with a many-to-many 
>>> relation between them.
>>>
>>> I didn't see your mapping-definition, but at the moment it looks like 
>>> you are trying to make a one-to-many relationship between your attributes 
>>> and types. Because you join over the attributeID column it would be one 
>>> attribute per type (and consequently possibly many types per attribute). 
>>> But I have the feeling that is not exactly what you want to model. However, 
>>> I will use this one-to-many relationship in an example below to explain 
>>> something else.
>>>
>>> *Second* (using a one-to-many relationship between types and 
>>> attributes):
>>> It is more than just a naming-matter: your query goes wrong because of 
>>> mixing the object paradigm and the relational paradigm. 
>>>
>>> *relational paradigm*
>>> You know this: you have tables that are linked by foreign keys. In your 
>>> case you have a table with attributes(dgmTypeAttributes) and a table with 
>>> types (dgmAttributeTypes) and they are linked by the attributeID key. SQL 
>>> is the language to query those tables.
>>>
>>> *object paradigm*
>>> Forget about foreign keys for a moment; this is not relevant when 
>>> working with the attributes and types as objects. You habe a Type entity 
>>> and a Attribute entity. An type can have 1 attribute, so an type has a 
>>> attribute-field. That attribute field doesn't contain an ID (that is 
>>> thinking in the relational paradigm), but it contains an Attribute entity. 
>>> The other way around: an attribute can contain a collection of types. So 
>>> there is an types-field in Attribute. It is not containing type-IDs, but is 
>>> a collection of Type entities. DQL is the language to query those objects.
>>>
>>> *ORM*
>>> Object-Relational Mapping is a mapping layer between the database tables 
>>> (the relational paradigm) and the entities (object paradigm). In the 
>>> mapping layer you not only define which tables/columns are related to which 
>>> entities/fields, but also how those objects that are contained in another 
>>> object (for instance: a attribute-object that is a field in an type-object) 
>>> are mapped to their respective tables and columns by means of foreign keys 
>>> (those attributeID columns). Because you define the columns used in a join 
>>> (those foreign keys) in this mapping, you don't specify those in the DQL 
>>> JOIN anymore.
>>>
>>> Hope this helps to understand what is wrong and how it should be done. 
>>> In your case I'd start with the first part: get clear what relationship is 
>>> between types and attributes. Get both the tables, the entities and the 
>>> mapping right and then the DQL query is easy. 
>>>
>>> Best wishes everybody for 2014! May all your objects be nicely mapped!
>>> Herman
>>>
>>>
>>> On Thursday, 26 December 2013 23:52:22 UTC+1, [email protected]:
>>>>
>>>> Hi,
>>>>
>>>> I have DQL query:
>>>>
>>>> $query = $qb->select('ta', 'at')
>>>>                    ->from('EveStatic\Entity\DgmTypeAttribute', 'ta')
>>>>                    ->innerJoin('ta.attributeID', 'at')
>>>>                    ->where('ta.typeID = :typeID')
>>>>                    ->setParameter('typeID', $this->typeID)
>>>>                    ->getQuery();
>>>>
>>>> getSQL() returns:
>>>>
>>>> SELECT d0_.typeID AS typeID0, d0_.valueInt AS valueInt1, d0_.valueFloat AS 
>>>> valueFloat2, d1_.attributeID AS attributeID3, d1_.attributeName AS 
>>>> attributeName4, d1_.description AS description5, d1_.iconID AS iconID6, 
>>>> d1_.defaultValue AS defaultValue7, d1_.published AS published8, 
>>>> d1_.displayName AS displayName9, d1_.unitID AS unitID10, d1_.stackable AS 
>>>> stackable11, d1_.highIsGood AS highIsGood12, d0_.attributeID AS 
>>>> attributeID13, d1_.categoryID AS categoryID14 FROM dgmTypeAttributes d0_ 
>>>> INNER JOIN dgmAttributeTypes d1_ ON d0_.attributeID = d1_.attributeID 
>>>> WHERE d0_.typeID = ?
>>>>
>>>>
>>>> Directly at mysql it returns 8 rows, but getResult() or getArrayResult() 
>>>> returns only first row with relations loaded. It should return 8 unique 
>>>> rows with relations loaded I think.
>>>>
>>>>
>>>> Can anyone help me please and tell me, what I am doing wrong?
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> Miroslav Misek
>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to