->joinAdd()

->joinAdd() – Ajout un autre objet de données pour construire une requête de jointure

Synopsis

void $DB_DataObject->joinAdd ( object $dataobject , string $joinType , string $joinAs , string $joinCol )

Description

Construit une requête de jointure, en ajoutant un autre objet de données à celui déjà présent. Soyez prudent lorsque vous utilisez cette méthode, les requêtes simples seront plus claires que lors de l'utilisation de joinAdd().

Merci à Stijn de Reede pour avoir implémenté cette méthode.

Parameter

  • object $obj - l'objet à joindre (aucune valeur effacera la jointure courante)

  • string $joinType - "LEFT" | "INNER " | "RIGHT" | ""

    INNER est la valeur par défaut, "" indique juste une requête du type 'select ... from a,b,c' sans jointure et les liens seront ajoutés dans les éléments 'where'.

    Note : 'LEFT' est la même chose que LEFT OUTER.

  • string $joinAs - si vous voulez sélectionner la table sous un autre nom ; utile lorsque vous voulez sélectionner plusieurs colonnes depuis une seconde table.

  • string $joinCol - La colonne de cet objet qui correspond, nécessaire si cette table est liée à un fils de l'objet en plusieurs endroits e.g.

    Utilisation de colonnes de jointure spécifiques

    user->friend (is a id of a person)
    user->mother (is a id of another person)

Note

This function can not be called statically.

Les exemples ci-dessous n'ont pas été testés, utilisez DB_DataObject::debugLevel(1), pour voir exactement ce qu'il se passe lorsque vous les utilisez et envoyez à l'auteur de meilleurs exemples...

Example

Jointure simple

<?php
// (nécessite un fichier links.ini correctement définit)
// récupération de toutes les images pour le produit 24

$i = new DataObject_Image();
$pi = new DataObjects_Product_image();
$pi->product_id 24// set the product id to 24
$i->joinAdd($pi); // add the product_image connectoin
$i->find();
while (
$i->fetch()) {
   
// faites quelques choses
}
?>

SQL résultant


SELECT * FROM image
  LEFT JOIN product_image
    ON (image.id = product_image.image_id)
  WHERE product_image.id = 24

Jointure plus complexe

<?php
// un exemple avec 2 jointures
// récupération de toutes les images liées avec 'products' ou 'productgroups'
$i = new DataObject_Image();
$pi = new DataObject_Product_image();
$pgi = new DataObject_Productgroup_image();
$i->joinAdd($pi);
$i->joinAdd($pgi);
$i->find();
while (
$i->fetch()) {
   
// faites quelques choses
}
?>

SQL résultant


SELECT * FROM image,product_image
LEFT JOIN image ON product_image
LEFT JOIN image ON productgroup_image
WHERE product
AND product.id = product_image.pid
AND product.id = productgroup_image.pid
Construit le composant sélectionné d'une requête (habituellement, pour une jointure) (Previous) Surcharge automatique (Next)
Last updated: Sun, 29 Aug 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: avkachalov@gmail.com
There is a possibility to join using complex conditions. You can pass second and other arguments as an associative array and an extra argument useWhereAsOn becomes availabile in that case.

See sources for full documentation. Quote:

/*
If second Argument is array, it is assumed to be an associative
array with arguments matching below = eg.
'joinType' => 'INNER',
'joinAs' => '...'
'joinCol' => ....
'useWhereAsOn' => false
*/
Note by: alan@akbkhome.com
You may want to use $do->selectAs($joinedObj, 'prefix_%s') with the above example.
Note by: johng@neutralize.com

This took me ages and ages to figure out...

You can do some nice JOINs, so in the above example we can grab the image, product name and group name:

// -------------------------------------------------
// an example with 2 joins
// get all the images linked with products or productgroups
// and the product name and group name.
$i = new DataObject_Image();
$pi = new DataObject_Product_image();
$pgi = new DataObject_Productgroup_image();
$i->joinAdd($pi);
$i->joinAdd($pgi);

$i->selectAdd();
$i->selectAdd( 'image, product.name as p_name, product_group.name as g_name' );

$i->find();
while ($i->fetch()) {
echo $i->image;
echo $i->p_name;
echo $i->g_name;
}

// -------------------------------------------------

Note how the image object has new attributes called p_name and g_name? How cool is that?!

You may need to look at the syntax of addJoin, because you can also do:

// -------------------------------------------------

$i = DB_DataObject::factory('Items');
$status = DB_DataObject::factory('Status');

// is the join in your database.links.ini file? If not use:
// $i->joinAdd( $status, "LEFT", 'status', 'fk_status' );

// it is in the .ini file so use:
$i->joinAdd( $status, "LEFT" );

$i->joinAdd( $status, "LEFT", 'minor_status', 'fk_minor_status' );

$i->selectAdd( 'item.name as name, status.name as status, minor_status.name as minor_status' );

// -------------------------------------------------

This assumes that Items has two foreign keys, both to status (fk_status and fk_minor_status)

I have used 'LEFT' joins because no all items will have a status (it is null) but we still want to list that item.

Don't forget: DB_DataObject::debugLevel(1); is your best friend ever, please invite him to the party and make sure he has a drink.

I hope this helps someone out. I think these type of JOINs are a basic part of SQL, so it's nice to see them included in DB_DataObject. I have logged this a documentation bug, so I hope this may be fixed one day...

monk.e.boy
http://teethgrinder.co.uk/open-flash-chart/