Contenu de la base

Table city Table person
ID Ville Pays Mise à jour
1 Paris France 01/01/1970
2 Bordeaux France 01/01/1970
3 Lyon France 01/01/1970
4 Toulouse France 01/01/1970
5 New York America 01/01/1970
6 Boston America 01/01/1970
ID Personne Ville ID
1 Martin 1
2 Paul 3
3 Martin 4
4 Paul 3
5 Pierre 1
6 Pierre 3

Jointure : Nombre de prénoms uniques dans chaque ville

Requête executée : SELECT c.city_name , COUNT(DISTINCT p.person_name) as nbPerson FROM [City] c INNER JOIN [Person] p ON c.id = p.city GROUP BY c.city_name
Ville Nombre de personnes
Lyon 2
Paris 2
Toulouse 1

Person.class.php

<?php
/**
 * @author     Richaud Julien "Fladnag"
*/

use salt\Field;
use 
salt\DBHelper;

/**
 *
 * @property int $id
 * @property string $person_name
 * @property int $city
 */
class Person extends salt\Base {
    public function 
metadata() {
        
parent::MODEL()
            ->
registerId('id')
            ->
registerTableName('person')
            ->
registerFields(
                
Field::newNumber('id''ID')->sqlType('INT(11) PRIMARY KEY AUTO_INCREMENT'),
                
Field::newText('person_name''Personne')->sqlType('VARCHAR(50)'),
                
Field::newNumber('city''Ville ID')->sqlType('INT(11)')
            );
    }

    public function 
initAfterCreateTable(DBHelper $db) {
        
$datas = array();
        
$datas[]=array('Martin'1);
        
$datas[]=array('Paul'3);
        
$datas[]=array('Martin'4);
        
$datas[]=array('Paul'3);
        
$datas[]=array('Pierre'1);
        
$datas[]=array('Pierre'3);

        
$objects = array();
        foreach(
$datas as $data) {
            
$o = new Person();
            list(
$name$city) = $data;
            
$o->person_name $name;
            
$o->city $city;
            
$objects[] = $o;
        }
        return 
$objects;
    }
}

City.class.php

<?php
/**
 * @author     Richaud Julien "Fladnag"
 */

use salt\Field;
use 
salt\SqlDateFormat;
use 
salt\DBHelper;

/**
 *
 * @property int $id
 * @property string $city_name
 * @property string $country
 * @property int $date_mise_a_jour
 */
class City extends salt\Base {
    public function 
metadata() {

        
parent::MODEL()
            ->
registerId('id')
            ->
registerTableName('city')
            ->
registerFields(
                
Field::newNumber('id''ID')->sqlType('INT(11) PRIMARY KEY AUTO_INCREMENT'),
                
Field::newText('city_name''Ville')->sqlType('VARCHAR(50) UNIQUE'),
                
Field::newText('country''Pays')->sqlType('VARCHAR(50)'),
                
Field::newDate('date_mise_a_jour''Mise à jour'SqlDateFormat::DATETIMEsalt\DEFAULT_DATE_DISPLAY_FORMATtrue)
            );
    }

    public function 
initAfterCreateTable(DBHelper $db) {
        
$datas = array(
            
'Paris' => 'France',
            
'Bordeaux' => 'France',
            
'Lyon' => 'France',
            
'Toulouse' => 'France',
            
'New York' => 'America',
            
'Boston' => 'America',
        );
        
$objects = array();
        foreach(
$datas as $k=>$v) {
            
$o = new City();
            
$o->city_name $k;
            
$o->country $v;
            
$objects[] = $o;
        }

        return 
$objects;
    }
}

jointure.php

<?php
/**
 * @author     Richaud Julien "Fladnag"
*/
define('TITLE''Jointure');
include(
'../../lib/base.php');

use 
salt\DatabaseHelper;
use 
salt\DBHelper;
use 
salt\Query;
use 
salt\SqlExpr;

$DBtest DBHelper::getInstance(DB_DATABASE_TEST);

include(
RELATIVE.'examples/dao/Person.class.php');
include(
RELATIVE.'examples/dao/City.class.php');

$missings DatabaseHelper::missingTables($DBtest, array('City''Person'));
if (
count($missings) > 0) {
    
DatabaseHelper::createTablesFromObjects($DBtest$missings);
}


include(
RELATIVE.'examples/layout/header.php');
?>
<div>
<h3>Contenu de la base</h3>
<?php
// Chargement de tout le contenu pour affichage
// API Query
//$qCity = City::query(TRUE);
//$allCities = $DBtest->execQuery($qCity);

// $qPerson = Person::query(TRUE);
// $allPerson = $DBtest->execQuery($qPerson);


// API SQL
$allCities $DBtest->execSQL("SELECT * FROM [City]");
$allPerson $DBtest->execSQL("SELECT * FROM [Person]");


?>
<table>
    <tr>
        <th>Table <?= City::MODEL()->getTableName() ?></th>
        <th>Table <?= Person::MODEL()->getTableName() ?></th>
    </tr>
    <tr>
        <td>
            <table>
                <tr>
<?php foreach($allCities->getColumns() as $col) { ?>
                    <th><?= City::COLUMN()->$col?></th>
<?php ?>
                </tr>
<?php foreach($allCities->getAllAs(City::singleton()) as $row) { ?>
                <tr>
<?php     foreach($allCities->getColumns() as $col) { ?>
                    <td><?= $row->VIEW->$col ?></td>
<?php     ?>
                </tr>
<?php ?>
            </table>
        </td>
        <td>
            <table>
                <tr>
<?php foreach($allPerson->getColumns() as $col) { ?>
                    <th><?= Person::COLUMN()->$col?></th>
<?php ?>
                </tr>
<?php foreach($allPerson->getAllAs(Person::singleton()) as $row) { ?>
                <tr>
<?php     foreach($allPerson->getColumns() as $col) { ?>
                    <td><?= $row->VIEW->$col ?></td>
<?php     ?>
                </tr>
<?php ?>
            </table>
        </td>
    </tr>
</table>

<h3>Jointure : Nombre de prénoms uniques dans chaque ville</h3>
<?php
// API Query
// $qCity = City::query();
// $qPerson = Person::query();

// // Jointure entre city.id et person.city : $qPerson->city renvoi un SqlExpr
// $qCity->join($qPerson, 'id', '=', $qPerson->city);

// $qCity->selectField('city_name');
// $qCity->select(
//         // Fonction COUNT appliqué au champ "person.person_name", auquel on a ajouté DISTINCT
//         SqlExpr::_COUNT($qPerson->person_name->distinct()),
//         // alias obligatoire pour mapper la property sur un champ de l'objet de retour
//         'nbPerson'
//         );

// // Un SqlExpr est aussi possible dans le group by et le order by
// $qCity->groupBy('city_name');
// $result = $DBtest->execQuery($qCity);

// API SQL
$qCity 'SELECT c.city_name
            , COUNT(DISTINCT p.person_name) as nbPerson
FROM [City] c
INNER JOIN [Person] p ON c.id = p.city
GROUP BY c.city_name'
;
$result $DBtest->execSQL($qCity);

?>
Requête executée : <?= $Input->HTML($qCity?>
<table>
    <tr>
<?php foreach($result->getColumns(array('nbPerson')) as $col) { ?>
        <th><?= City::COLUMN()->$col?></th>
<?php ?>
        <th>Nombre de personnes</th>
    </tr>
<?php foreach($result->getAllAs(City::singleton()) as $row) { ?>
    <tr>
<?php     foreach($result->getColumns() as $col) { ?>
        <td><?= $row->VIEW->$col ?></td>
<?php     ?>
    </tr>
<?php ?>
</table>
</div>

<div>
    <h3>Person.class.php</h3>
    <?php highlight_file(RELATIVE.'examples/dao/Person.class.php'); ?>
    <br/>
    <h3>City.class.php</h3>
    <?php highlight_file(RELATIVE.'examples/dao/City.class.php'); ?>
    <br/>
    <h3><?= \salt\last(explode(DIRECTORY_SEPARATOR__FILE__)) ?></h3>
    <?php highlight_file(__FILE__); ?>
</div>

<?php
include(RELATIVE.'examples/layout/footer.php');