I agree with Jasper. He explains clearly when you need a third entity 
between two entities having a ManyToMany relation. But I always put much 
emphasis on giving the right names to those entities, otherwise your model 
becomes very messy. RelationType indeed looks better to me than Relation; 
but there might be other even more descriptive names. 

On Tuesday, 1 April 2014 10:48:22 UTC+2, Jàπ (Jasper N. Brouwer) wrote:
>
> About the 3rd point: 
>
> The `Relative` entity in this case is representing the ManyToMany 
> association between 2 `User` entities. This associations needs additional 
> data, so it becomes a OneToMany/ManyToOne association (hence the entity). 
>
> I do agree that the name `Relative` might not be the best choice. I agree 
> that it's the User that's a relative of another User. So maybe it could be 
> called `Relation`, because the association represents the _relation_ 
> between 2 Users. 
>
> I think the current `Relation` entity should be named `RelationType`, as 
> it's metadata about the `Relation` (currently named `Relative`). If I 
> understood correctly it's going to contain values like "brother/brother" 
> and "father/son". 
>
> So the complete picture would look like this: 
>
>     User <- OneToMany -> Relation <- ManyToOne -> User 
>
>     Relation <- ManyToOne -> RelationType 
>
>
> A final suggestion: 
>
> Give `Relation` the properties `$id`, `$user`, `$relatedToUser` and 
> `$relationType`. 
> You have a `invitedby_id` in the table, but I'm not sure this is needed. I 
> think you want to store the user that initiated the relation, but that's 
> always the user in `$user` (never `$relatedToUser`), I'll get to that in a 
> moment. 
>
> Have `RelationType` contain values like "father" and "son", not 
> "father/son". 
>
> Now, say you have User(1) and User(2), and $user1 wants $user2 to be his 
> son. You can create a `Relation` entity like so: 
>
>     $id = 123 
>     $user = User(1) 
>     $relatedToUser = User(2) 
>     $relationType = RelationType("son") 
>
> Now you app knowns User(2) is the son of User(1) (from User(1)'s 
> perspective), but it doesn't know that User(1) is the father of User(2) 
> (from User(2)'s perspective). If you do want your app to know the latter, 
> create a second relation: 
>
>     $id = 456 
>     $user = User(2) 
>     $relatedToUser = User(1) 
>     $relationType = RelationType("father") 
>
> If you always want to have these 2 `Relation` entities for a single 
> father/son -like relation, have something like a RelationManager service 
> create (and remove) those entities. 
>
> The reason I suggest using 2 `Relation` entities is because using this 
> throughout your app will be much easier. When you need to know all the 
> relatives of User(1), you can simple query all `Relation::$relatedToUser` 
> users where `Relation::$user` is User(1). 
> When using only one `Relation` entity, you would have to query for all 
> `Relation::$relatedToUser` users where `Relation::$user` is User(1) OR all 
> `Relation::$user` users where `Relation::$relatedToUser` is User(1). 
>
> I hope this helps! 
>
> -- 
> Jasper N. Brouwer 
> (@jaspernbrouwer) 
>
>
> On 1 Apr 2014, at 10:06, Herman Peeren <[email protected] <javascript:>> 
> wrote: 
>
> > On Tuesday, 1 April 2014 07:12:49 UTC+2, Swapna V wrote: 
> > (...) that model could be improved, definitely would like to get 
> suggestions (...). 
> > 
> > First thing I would do: to name all entities in singular, not plural. 
> You don't have a "Users" entity, but a User. That its data is based on a 
> users-table (named in plural) is OK, but the entity itself is a User, not a 
> Users. It seems trivial, but it will help you in thinking in objects 
> (entities) instead of tables. 
> > 
> > Second: what is your Relation-object? Do you need it? What is it that 
> you try to model? Easier is not to start with the tables, but first have a 
> look at what your "domain" is that you want to model. See next point too. 
> > 
> > Third: I doubt if  a Relative is something else than a User. Probably 
> relatives are other users. In that case it is a User entity with a 
> ManyToMany association to itself: a User can have many other users as 
> relatives and a User can be the relative of many other users. I always 
> start with sentences like that. 
>
>

-- 
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/d/optout.

Reply via email to