Join the social network of Tech Nerds, increase skill rank, get work, manage projects...
 
  • Using Containable in CakePHP

    • 0
    • 0
    • 0
    • 0
    • 1
    • 0
    • 0
    • 0
    • 217
    Comment on it

    Containable behavior was introduced in CakePHP 1.0. It helps you out to find out the data from the associated models/tables in a consistent way.

    Containable simplifies the binding operation in your model bindings. To use the new behavior, you need to use $actAs property of your model.

    class Post extends AppModel {
        public $actsAs = array('Containable');
    }
    

    Or YOu can do this on the fly as following:-

    $this->Post->Behaviors->load('Containable');
    

    Lets take and example:-

    debug($this->Post->find('all'));
    
    [0] => Array
            (
                [Post] => Array
                    (
                        [id] => 1
                        [title] => First article
                        [content] => aaa
                        [created] => 2008-05-18 00:00:00
                    )
                [Comment] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [post_id] => 1
                                [author] => Daniel
                                [email] => dan@example.com
                                [website] => http://example.com
                                [comment] => First comment
                                [created] => 2008-05-18 00:00:00
                            )
                        [1] => Array
                            (
                                [id] => 2
                                [post_id] => 1
                                [author] => Sam
                                [email] => sam@example.net
                                [website] => http://example.net
                                [comment] => Second comment
                                [created] => 2008-05-18 00:00:00
                            )
                    )
                [Tag] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [name] => Awesome
                            )
                        [1] => Array
                            (
                                [id] => 2
                                [name] => Baking
                            )
                    )
            )
    [1] => Array
            (
                [Post] => Array
                    (...
    

    Lets assume you have to find all the posts, in which Daniel commented:-

    $this->Post->contain('Comment.author = "Daniel"');
    $this->Post->find('all');
    
    
    //or...
    
    $this->Post->find('all', array('contain' => 'Comment.author = "Daniel"'));
    
    
    [0] => Array
            (
                [Post] => Array
                    (
                        [id] => 1
                        [title] => First article
                        [content] => aaa
                        [created] => 2008-05-18 00:00:00
                    )
                [Comment] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [post_id] => 1
                                [author] => Daniel
                                [email] => dan@example.com
                                [website] => http://example.com
                                [comment] => First comment
                                [created] => 2008-05-18 00:00:00
                            )
                    )
            )
    

    But this will contain all the posts in which daniel didn't made any comment. The result will appear as follows:-

    [0] => Array
            (
                [Post] => Array
                    (
                        [id] => 1
                        [title] => First article
                        [content] => aaa
                        [created] => 2008-05-18 00:00:00
                    )
                [Comment] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [post_id] => 1
                                [author] => Daniel
                                [email] => dan@example.com
                                [website] => http://example.com
                                [comment] => First comment
                                [created] => 2008-05-18 00:00:00
                            )
                    )
            )
    [1] => Array
            (
                [Post] => Array
                    (
                        [id] => 2
                        [title] => Second article
                        [content] => bbb
                        [created] => 2008-05-18 00:00:00
                    )
                [Comment] => Array
                    (
                    )
            )
    [2] => Array
            (
                [Post] => Array
                    (
                        [id] => 3
                        [title] => Third article
                        [content] => ccc
                        [created] => 2008-05-18 00:00:00
                    )
                [Comment] => Array
                    (
                        [0] => Array
                            (
                                [id] => 22
                                [post_id] => 3
                                [author] => Daniel
                                [email] => dan@example.com
                                [website] => http://example.com
                                [comment] => Another comment
                                [created] => 2008-05-18 00:00:00
                            )
                    )
            )
    

    To filter the results deeply you can do the following:-

    $this->User->recursive = -1;
    

    recursive (boolean, optional) set to true to allow containable to automatically determine the recursiveness level needed to fetch specified models, and set the model recursiveness to this level. setting it to false disables this feature. The default value is true.

 1 Comment(s)

Sign In
                           OR                           
                           OR                           
Register

Sign up using

                           OR                           
Forgot Password
Fill out the form below and instructions to reset your password will be emailed to you:
Reset Password
Fill out the form below and reset your password: