[Propel] Abfragen überdiverse Tabellen mit Alternativen

[Propel] Abfragen überdiverse Tabellen mit Alternativen

am 04.10.2007 20:21:53 von Jonas Werres

Hallo,
ich habe folgendes Problem. Ich möchte mit Propel eine Query erstellen, die
alle Domains ausgibt, an denen ein User ein bestimmtes Recht hat. Soweit so
gut.

Eine Domain gehört zu einem Projekt (n:1), ein Projekt gehört zu einer oder
mehreren Organisationen (n:n). Es reicht, wenn der User an einer dieser
Strukturen das Recht hat (Recht an Projekt bedeutet Recht an allen
untergeordneten Domains etc.).
Weiter hin können alle Recht nochmal einer Gruppe zugeordnet sein (kann man
hier als Rechtetemplate verstehen), die mit dem User n:n verknüpft ist.

Einzel kann ich das abfragen. Dann habeich 6 Queries. Im Grunde will ich
aber nur eine Liste. Kriege ich die Criteria irgendwie zusammengebastelt?
Bisher scheint Propel mindesten an mehrmals vorkommenden Tabellen zu
krepieren (scheint wohl kein AS zu verwenden) bzw. stirbt kommentarlos (!)
beim Zusammenführen der Criteria.

Wäre toll, wenn da jemand mit mehr Erfahrung etwas sagen könnte.

Wenns denn gar nicht geht: Wie kriege ich das aus den Einzelqueries
zusammengefügte Array am ökonomischten 'distinct'? (Beachte, dass die
Elemente Objecte sind, die durch gleiches Ergbenis von getId() gleich sind,
nicht durch gleiche Referenz).

Hier sind die Einzelabfragen:

//Recht User an Domain
$cud=new Criteria();
$cud->addJoin(DomainPeer::ID,UserHasDomainpermissionPeer::DO MAIN_ID,Criteria::LEFT_JOIN);
$cud->add(UserHasDomainpermissionPeer::USER_ID,$this->getId( ));
$cud->add(UserHasDomainpermissionPeer::PERMISSION_ID,$permis sion);
$cud->setDistinct();

//Recht Gruppen an Domain
$cgd=new Criteria();
$cgd->addJoin(DomainPeer::ID,GroupHasDomainpermissionPeer::D OMAIN_ID);
$cgd->addJoin(UserHasGroupPeer::GROUP_ID,GroupHasDomainpermi ssionPeer::GROUP_ID);
$cgd->add(UserHasGroupPeer::USER_ID,$this->getId());
$cgd->add(GroupHasDomainpermissionPeer::PERMISSION_ID,$permi ssion);
$cgd->setDistinct();

//Recht User durch Project
$cup=new Criteria();
$cup->addJoin(DomainPeer::PROJECT_ID,UserHasProjectpermissio nPeer::PROJECT_ID);
$cup->add(UserHasProjectpermissionPeer::USER_ID,$this->getId ());
$cup->add(UserHasProjectpermissionPeer::PERMISSION_ID,$permi ssion);
$cup->setDistinct();

//Recht Gruppe durch Project
$cgp=new Criteria();
$cgp->addJoin(DomainPeer::PROJECT_ID,GroupHasProjectpermissi onPeer::PROJECT_ID);
$cup->addJoin(UserHasGroupPeer::GROUP_ID,GroupHasProjectperm issionPeer::GROUP_ID);
$cgp->add(UserHasGroupPeer::USER_ID,$this->getId());
$cgp->add(GroupHasProjectpermissionPeer::PERMISSION_ID,$perm ission);
$cgp->setDistinct();

//Recht User durch Organisation
$cuo=new Criteria();
$cuo->addJoin(DomainPeer::PROJECT_ID,ProjectHasOrganisationP eer::PROJECT_ID);
$cuo->addJoin(ProjectHasOrganisationPeer::ORGANISATION_ID,Us erHasOrganisationpermissionPeer::ORGANISATION_ID);
$cuo->add(UserHasOrganisationpermissionPeer::USER_ID,$this-> getId());
$cuo->add(UserHasOrganisationpermissionPeer::PERMISSION_ID,$ permission);
$cuo->setDistinct();

//Recht Gruppe durch Organisation
$cgo=new Criteria();
$cgo->addJoin(DomainPeer::PROJECT_ID,ProjectHasOrganisationP eer::PROJECT_ID);
$cgo->addJoin(ProjectHasOrganisationPeer::ORGANISATION_ID,Gr oupHasOrganisationpermissionPeer::ORGANISATION_ID);
$cgo->addJoin(UserHasGroupPeer::GROUP_ID,GroupHasOrganisatio npermissionPeer::GROUP_ID);
$cgo->add(UserHasGroupPeer::USER_ID,$this->getId());
$cgo->add(GroupHasOrganisationpermissionPeer::PERMISSION_ID, $permission);
$cgo->setDistinct();

Gruß

Re: [Propel] Abfragen überdiverse Tabellen mit Alternativen

am 04.10.2007 20:40:59 von Jonas Werres

Ich hab ja keine besondere Hoffnung, dass es jemand hinbekommt.
Hat jemand was besseres als das hier, um die Liste distinct zu kriegen?:
/**
* Removes duplicate (same PK!) Elemente from Domain array
*/
public static function makeDistinct($array)
{
function getIdFromObject($obj) {return $obj->getId();}

$array_PK=array_map('getIdFromObject',$array);

$arr_found=array();$return=array();
foreach($array_PK as $key_PK => $value_PK)
{
if(!in_array($value_PK,$arr_found))
$return[]=$array[$key_PK];

$arr_found[]=$value_PK;
}
return $return;
}