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::DATETIME, salt\DEFAULT_DATE_DISPLAY_FORMAT, true)
);
}
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');