I fully agree with Rolan here. I know this topic is a few years old, but I 
was curious to find out if a solution ever came to fruition. The fact that 
I can't just easily derive a standalone $parent, a $node, or a $child 
regardless of what Model I use to do the initial find on is causing me 
grief now in that I now have to code more to handle these different 
situations. Its a clear inconsistency and it would be nice to at least have 
an option to get it to output in this more consistent way.

As an example, take a simple Article -> Comment -> User relation.

An Article has many Comment, and a Comment belongs to a User,

If I do the find on the Article and have it also give me its Comment with 
its User I get:
$Article = Array
(
    [Article] => Array
    (
        [id] => 83
        ...
    )
    [Comment] => Array
    (
        [0] => Array
        (
            [id] => 2
            [content] => "Comment 1"
            [User] => Array
            (
                [id] => 3
                [name] => Bob
            )
        )
        [1] => Array
        (
            [id] = 3
            [content] = "Comment 2"
            [User] => Array
            (
                [id] => 3
                [name] => John
            )
        )
    )
)

I could then have a single view element that takes a $comment (lets assign 
$Article['Comment'][0] 
to it here) and renders out the content ($comment['content']) and the user 
who posted it ($comment['content']['name']).

If however, I want a lightweight way to get at the same comments using a 
find() on the Comment model (for implementing, for example, and AJAX 
comment provider), I get the following:
Array
(
    [0] => Array
    (
        [Comment] => Array
        (
            [id] => 2
            [content] => "Comment 1"
        )
        [User] => Array
        (
            [id] => 3
            [name] => Bob
        )
    )
    [1] => Array
    (
        [Comment] => Array
        (
            [id] = 3
            [content] = "Comment 2"
        )
        [User] => Array
        (
            [id] => 3
            [name] => John
        )
    )
)

I can't just grab a $comment now to feed to my view element. For each 
comment, I have to literally move the [User] element myself into the 
[Comment] element to get it in a format that the view element likes. And 
this costs processor power, and makes my code ugly.

Thanks.
Frank Weindel

On Friday, May 7, 2010 1:12:42 PM UTC-4, Roland Bock wrote:
>
>  Miles J wrote: 
>
> I don't see the benefit for this structure. Seems like twice the work
> for no gain.
>
> Cakes current implementation is best. The primary model and all
> relations usually return within the same dimension, as it does not
> need to be in hierarchical dimensions unless its a deep relationship.
>   
>
>  As of now, in a simple A -> B -> C relationship, 
>
> B found via Model A and 
> B found via Model B
>
> require different code because they are structured differently.
>
> Personally, I consider that inconsistent.
>
>  On May 7, 9:05 am, Roland Bock <[email protected]> wrote:
>   
>
>  Matthew Powell wrote:
>     
>
>  Jamie said it once, but I feel it's worth repeating.
>       
>
>  Modifying the code to output in a format YOU want for your new
> application could pretty much screw up every cakephp application out
> there.
>       
>
>  Matt
>       
>
>  Matt,
>
> I am fully aware of that. And that is certainly not a decision to be
> taken lightly. And if such a change should ever be introduced, some
> migration strategy would be required.
>
> BTW: I would have to change quite a few files myself.
>
> On the other hand, the current data structure is inconsistent. In the
> long run, it might be worth changing it.
>
> Regards,
>
> Roland
>
>
>
>
>
>     
>
>  On Fri, May 7, 2010 at 10:33, Roland Bock <[email protected]> wrote:
>       
>
>   Jamie,
>         
>
>   thanks for the reassurance :-)
>         
>
>   Submitting a ticket certainly is a good idea!
>         
>
>   Regards,
>         
>
>   Roland
>         
>
>   Jamie wrote:
>         
>
>   Hi Roland,
>         
>
>   What you're suggesting is a pretty major change to data returned by
> Cake - major in that there would be a lot of user-end code that needs
> changing if this were to happen to the core. Though I think it's
> awesome that you'd be willing to write a patch and submit it, maybe
> you should first submit a ticket to Lighthouse 
> (http://cakephp.lighthouseapp.com
> ) for some feedback from the core development team. To be honest, I
> found the structure of returned data a bit odd when I was starting out
> with Cake as well, so you're not the only one.
>         
>
>   - Jamie
>         
>
>   On May 7, 5:46 am, Roland Bock <[email protected]> wrote:
>         
>
>   Yes, and validation, too, I guess...
>         
>
>   I hope to find the time :-)
>         
>
>   Thanks for your help!
>         
>
>   Regards,
>         
>
>   Roland
>         
>
>   You could probably write a Behaviour, but that will take additional
> processing, which slows down the application.
>         
>
>   On May 7, 2:48 pm, Roland Bock <[email protected]> wrote:
>         
>
>   John Andersen wrote:
>         
>
>   I agree that the structure could be better, but as it is, is the way
> we have to work with it, and I consider it sufficient for my usage.
> Enjoy,
>    John
>         
>
>   OK, two questions:
>         
>
>   a) Do you think I could tweak current Models with a Behavior in order to
> get the structure I prefer?
>         
>
>   b) Do you think it would make sense to send a patch that would change
> the data structure (maybe for cake-1.4)?
>         
>
>   Thanks and regards,
>         
>
>   Roland
>         
>
>   On May 7, 12:30 pm, Roland Bock <[email protected]> wrote:
>         
>
>   Hi,
> John Andersen wrote:
>         
>
>   I do think that if you don't like something in CakePHP, please write
> your own solution to it, then offer it to the CakePHP developers.
>         
>
>   Sure. I'd like to understand first, though :-)
> In CakePHP, Parent -> Node -> Child leads to different ways to handle a
> single Node:
> $node['id'];    // in case Node has been retrieved by Parent
> $node[Child'];
> but
> $currentRecord['Node']['id']; // Node has been retrieved by Node
> $currentRecord['Child'];
> This seems to add complexity.
> Now, here is what I would aim for (including the Ghost you added)
> Array
> (
>     [Parent] => Array
>         (
>             [0] => Array
>                 (
>                     [id] => 1
>                     [Node] => Array
>                         (
>                             [0] => Array
>                                 (
>                                     [id] => 17
>                                     [Child] => Array
>                                         (
>                                         )
>                                 )
>                             [1] => Array
>                                 (
>                                     [id] => 19
>                                     [Child] => Array
>                                         (
>                                         )
>                                 )
>                         )
>                     [Ghost] => Array
>                         (
>                             [0] => Array
>                                 (
>                                     [id] => 2
>                                 )
>                             [1] => Array
>                                 (
>                                     [id] => 3
>                                 )
>                         )
>                 )
>         )
> )
> This way I can say
> $resultSet             <- This is an array of Parents
> $currentRecord = $resultSet['Parent']['0']
> $currentRecord         <- This is a Parent
> $currentRecord['id']
> $currentRecord['Node']
> $currentRecord['Node'][0]['id']
> $currentRecord['Node'][0]['Child']
> $currentRecord['Ghost]
> In the original CakePHP structure,
> $resultSet  <- This is an array of arrays(Parent,Nodes, Ghosts)
> $currentRecord = $resultSet['0']
> $currentRecord        <- This is a Parent/Nodes/Ghosts array
> $currentRecord['Parent']
> $currentRecord['Parent']['id']
> $currentRecord['Node']
> $currentRecord['Node'][0]['Child]
> $currentRecord['Ghost']
> So basically, my way, you need to write *less* to access members of
> 'Parent'. The rest is pretty similar. But, (huge benefit, I think), you
> can handle a Node always in the same way, regardless of whether you get
> it included in a Parent or use the Node Model directly:
> My way:
> $node['id'];  // no matter what
> $node['Child'];
> Remeber the CakePHP way:
> $node['id'];    // in case Node has been retrieved by Parent
> $node[Child'];
> but
> $currentRecord['Node']['id']; // Node has been retrieved by Node
> $currentRecord['Child'];
>         
>
>   Does the above helps you to clarify why the original structure is
> good?
>         
>
>   Not yet, I am afraid. Maybe I was able to intrigue you with my proposal? :-)
> Regards,
> Roland
>         
>
>   [snip]
> Check out the new CakePHP Questions sitehttp://cakeqs.organdhelpothers with
> their CakePHP related questions.
> You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group
> athttp://groups.google.com/group/cake-php?hl=en
>         
>   Check out the new CakePHP Questions sitehttp://cakeqs.organdhelpothers with
> their CakePHP related questions.
>         
>
>   You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group
> athttp://groups.google.com/group/cake-php?hl=en
>         
>   Check out the new CakePHP Questions sitehttp://cakeqs.organdhelp others
> with their CakePHP related questions.
>         
>
>   You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group
> athttp://groups.google.com/group/cake-php?hl=en
>         
>   Check out the new CakePHP Questions sitehttp://cakeqs.organdhelp others
> with their CakePHP related questions.
>         
>
>   You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group
> athttp://groups.google.com/group/cake-php?hl=en
>         
>   Check out the new CakePHP Questions sitehttp://cakeqs.organd help others
> with their CakePHP related questions.
>         
>
>   You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group 
> athttp://groups.google.com/group/cake-php?hl=en
>         
>   Check out the new CakePHP Questions sitehttp://cakeqs.organd help others
> with their CakePHP related questions.
>         
>
>   You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group 
> athttp://groups.google.com/group/cake-php?hl=en
>         
>   Check out the new CakePHP Questions sitehttp://cakeqs.organd help others 
> with their CakePHP related questions.
>       
>
>  You received this message because you are subscribed to the Google Groups 
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group 
> athttp://groups.google.com/group/cake-php?hl=en
>       
>  Check out the new CakePHP Questions sitehttp://cakeqs.organd help others 
> with their CakePHP related questions.
>
> You received this message because you are subscribed to the Google Groups 
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group 
> athttp://groups.google.com/group/cake-php?hl=en
>     
>  Check out the new CakePHP Questions site http://cakeqs.org and help others 
> with their CakePHP related questions.
>
> You received this message because you are subscribed to the Google Groups 
> "CakePHP" group.
> To post to this group, send email to [email protected] <javascript:>
> To unsubscribe from this group, send email [email protected] 
> <javascript:> For more options, visit this group at 
> http://groups.google.com/group/cake-php?hl=en
>   
>  
>  Check out the new CakePHP Questions site http://cakeqs.org and help 
> others with their CakePHP related questions.
>  
> You received this message because you are subscribed to the Google Groups 
> "CakePHP" group.
> To post to this group, send email to [email protected]<javascript:>
> To unsubscribe from this group, send email to
> [email protected] <javascript:> For more options, visit this 
> group at http://groups.google.com/group/cake-php?hl=en
>

-- 
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

--- 
You received this message because you are subscribed to the Google Groups 
"CakePHP" 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/cake-php?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to