Wednesday, January 2, 2013

Re: queries on HABTM relationships

I just realised that this also makes no sense. Why are you running a
COUNT(*) on Group when your condition is to select only the Group with
id = 1?

Perhaps you need to start from the beginning and explain what it is
you're looking for.

And I'll second the suggestion to use ACL.

On Wed, Jan 2, 2013 at 5:50 PM, lowpass <zijn.digital@gmail.com> wrote:
> I think that should be something like:
>
> $data = $this->controller()->Group->find(
> 'count',
> array(
> 'conditions' => array(
> 'Group.id' => 1 // hard-coded for testing?
> ),
> 'joins' => array(
> array(
> 'type' => 'INNER',
> 'table' => 'groups_perms',
> 'alias' => 'GroupPerm',
> 'conditions' => array(
> 'GroupPerm.group_id' => 'Group.id'
> )
> ),
> array(
> 'type' => 'INNER',
> 'table' => 'perms',
> 'alias' => 'Perm',
> 'conditions' => array(
> 'GroupPerm.perm_id' => 'Perm.id'
> )
> )
> )
> )
> );
>
> However, I've left out the perm.id='can_access_admin' part because it
> makes no sense in the context of Cake. The id column should be an INT.
> I presume you mean something like 'Perm.type' => 'can_access_admin',
> in which case add it to the 2nd joins conditions array.
>
> On Wed, Jan 2, 2013 at 3:48 PM, Stefano Campanella
> <leonardo@guildofmessengers.com> wrote:
>> mmh, ok. But the problem is that even if I change the find("count") into a
>> find("all") it still loads data only from Group table.
>>
>> Yes I am using the AuthComponent for logged in users. But since I want to
>> use my Authorize class also for managing what anonymous users can access I
>> am calling $this->Auth->isAuthorized() in the beforeFilter of AppController
>> with a $user parameter of array('id'=>0). Inside the authorize method I
>> recognize the empty user and make checks for permissions on an hard coded
>> group id. I checked this would work correctly, if only I could make the
>> query in the right way.
>>
>> Let's change the question. Which code would you write to make CakePHP
>> execute this query:
>>>
>>> SELECT COUNT(*) AS count FROM groups INNER JOIN groups_perms ON
>>> groups.id=groups_perms.group_id INNER JOIN perm ON
>>> groups_perms.perm_id=perm.id WHERE group.id=1 AND perm.id='can_access_admin'
>>
>> given that you have access to $this->controller()->Group?
>>
>> Thanks
>>
>> On Wednesday, January 2, 2013 7:59:24 PM UTC+1, cricket wrote:
>>>
>>> When running a find('count') the contain param is useless. This is
>>> because the main query is fetching a sum, not a set of records from
>>> which to fetch the associated 'contain' records.
>>>
>>> Are you using AuthComponent? You can use that to fetch the User and
>>> associated records. However, I can't remember how deep it goes. To see
>>> what records it has, put this in your UsersController login method:
>>>
>>> die(debug($this->Auth->user()));
>>>
>>>
>>> http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#accessing-the-logged-in-user
>>>
>>> On Tue, Jan 1, 2013 at 5:23 PM, Stefano Campanella
>>> <leon...@guildofmessengers.com> wrote:
>>> > Hello all,
>>> > this is my first time posting here. I recently started to study how to
>>> > use
>>> > CakePHP and I'm trying to develop a website.
>>> > In my website I am writing a custom authorize component where each user
>>> > get
>>> > one or more groups and each group has one or more permissions associated
>>> > to
>>> > it.
>>> > I have problems in using the find() method.
>>> > This is my structure:
>>> > User hasAndBelongsToMany Group
>>> > Group hasAndBelongsToMany Perm
>>> >
>>> > I have attached Containable to all the Models (in AppModel)
>>> >
>>> > now in my authorization component I need to check if a group has a
>>> > specific
>>> > permission, and for this I use find():
>>> >
>>> >> if(!isset($this->controller()->Group)){
>>> >> $this->controller()->loadModel('Group');
>>> >> }
>>> >> $n_perm=$this->controller()->Group->find('count',array(
>>> >> 'conditions'=>array('id'=>1),
>>> >> 'contain'=>array(
>>> >> 'Perm'=>array(
>>> >> 'conditions' => array('id'=>'can_access_admin')
>>> >> )
>>> >> )
>>> >>
>>> >> ));
>>> >
>>> >
>>> > I would expect this to give me a result >=1 if group 1 has the
>>> > 'can_access_admin' permission, and =0 if the group has no such
>>> > permission.
>>> > This is not what actually happens, the only query that cakePHP shows is
>>> > this:
>>> >
>>> > SELECT COUNT(*) AS `count` FROM `groups` AS `Group` WHERE `id` = 1
>>> >
>>> > And it is obviously not enough to find what I requested.
>>> >
>>> > Can anyone help me?
>>> >
>>> > Thanks
>>> >
>>> > --
>>> > 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 post to this group, send email to cake...@googlegroups.com.
>>> > To unsubscribe from this group, send email to
>>> > cake-php+u...@googlegroups.com.
>>> > 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 post to this group, send email to cake-php@googlegroups.com.
>> To unsubscribe from this group, send email to
>> cake-php+unsubscribe@googlegroups.com.
>> 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 post to this group, send email to cake-php@googlegroups.com.
To unsubscribe from this group, send email to cake-php+unsubscribe@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php?hl=en.

No comments: