Bonjour,
Je ne sais pas si je suis au bonne endroit pour poser cette question, mais bon ...
Je développe un composant pour Joomla dans lequel je dois effectuer certaines recherches d'où une page de recherche avancée faisant appel à un Model/Book.php
Pourquoi est-ce qu'à partir de ce code le resultat fait systématiquement appel à la table book correspondant au $Query ?
Voisi le resultat de la requete :
SELECT *
FROM nr3zk_nglibrary_books AS book
WHERE ((SELECT COUNT(*)
FROM `nr3zk_nglibrary_books` AS book WHERE (`book`.`title` LIKE "%tintin%") OR (`book`.`subtitle` LIKE "%tintin%") OR (`book`.`coll5` LIKE "%tintin%")) >= '1')
OR
((SELECT COUNT(*) FROM `nr3zk_nglibrary_copies` AS copie WHERE (`copie`.`origin` LIKE "La Ferté Fresnel - Fonds Propre%") AND (`copie`.`nglibrary_library_id` = 2) ) >= '1')
OR (`book`.`title` LIKE '%tintin%') OR (`book`.`subtitle` LIKE '%tintin%') OR (`book`.`coll5` LIKE '%tintin%')
ORDER BY `title` ASC,`title` ASC LIMIT 20
Si par hasard l'un d'entre vous avez un exemple de page de recherche avancée sur plusieurs tables SQL je suis preneur.
merci à vous
Je ne sais pas si je suis au bonne endroit pour poser cette question, mais bon ...
Je développe un composant pour Joomla dans lequel je dois effectuer certaines recherches d'où une page de recherche avancée faisant appel à un Model/Book.php
Code PHP:
public function onBeforeBuildQuery($query, $overrideLimits = false)
{
/**
* TMP FIX
*/
$query->clear('from')->from($this->getTableName() . ' AS book');
$this->setBehaviorParam('tableAlias', 'book');
$outerGlue = $this->input->get('_outerGlue');
/**
* /TMP FIX
*/
if ($this->input->get('_resetState') == 1)
{
// Save the state we need to keep
$limit = $this->getState('limit');
// Reset model and user state
$this->clearState()->reset();
\JFactory::getApplication()->setUserState(substr($this->getHash(), 0, -1), null);
// Set back the saved state
$this->input->set('limit', $limit);
$this->setState('limit', $limit);
}
//Pour la recherche avancé
//Recheche avancée titre et autre ...
//Recherche dans la table __Copies
if($this->input->get('advancedsearch') !=''){
if ($this->input->get('copiesStatusId'))
{
$this->input->set('copies',
array_merge(['statusId' => $this->input->get('copiesStatusId')],$this->input->get('copies', [], 'array') )
);
}
if ($this->input->get('copiesLibraryId'))
{
$this->input->set('copies',
array_merge(['libraryId' => $this->input->get('copiesLibraryId')],$this->input->get('copies', [], 'array') )
);
}
if ($this->input->get('origin'))
{
$this->input->set('copies',
array_merge(['origin' => $this->input->getString('origin')],$this->input->get('copies', [], 'array') )
);
}
if ($this->input->get('location'))
{
$this->input->set('copies',
array_merge(['location' => $this->input->getString('location')],$this->input->get('copies', [], 'array') )
);
}
if ($this->input->get('statusBib'))
{
$this->input->set('copies',
array_merge(['statusBib' => $this->input->getString('statusBib')],$this->input->get('copies', [], 'array') )
);
}
//exclure les périodques;
if ($this->input->get('hideperiodique') == 1)
{
$this->input->set('copies',
array_merge(['hideperiodique' => $this->input->getString('hideperiodique')],$this->input->get('copies', [], 'array') )
);
}
//todo les select peuvent être mis indépendement les uns des autres
$select = " AND " ;
if (($copies = $this->getState('copies'))
&& array_filter($copies))
{ $sql = '';
if (!empty($copies['number']))
$sql .= ('(`copie`.`number` = "' . $copies['number'] . '")' . $select.'');
if (!empty($copies['cote']))
$sql .= ('(`copie`.`cote` LIKE "' . $copies['cote'] . '%")' . $select.'');
if (!empty($copies['origin']))
$sql .= ('(`copie`.`origin` LIKE "' . $copies['origin'] . '%")' . $select.'');
if (!empty($copies['location']))
$sql .= ('(`copie`.`location` LIKE "' . $copies['location'] . '%")' . $select.'');
if (!empty($copies['statusId']))
$sql .= ('(`copie`.`nglibrary_bookstatus_id` = "' . $copies['statusId'] . '")' . $select.'');
if (!empty($copies['libraryId']))
$sql .= ('(`copie`.`nglibrary_library_id` = ' . $copies['libraryId'] . ')' . $select.'');
if (!empty($copies['statusBib']))
$sql .= ('(`copie`.`status_bib` = "' . $copies['statusBib'] . '")' . $select.'');
if (!empty($copies['hideperiodique']))
$sql .= ('(`copie`.`periodique` != "' . $copies['hideperiodique'] . '")' . $select.'');
if(substr($sql,-3) == ' OR '){
$sql = substr($sql,0,-3);
}else{
$sql = substr($sql,0,-4);
}
//Recherche dans la table __Books
if (!empty($this->input->get('title')))
{$sql2 ='';
//j'enleve les prefixes du titre pour la recherche
$title = preg_replace ("#^(le |la |les |LE |LA |LES )#","",$this->input->get('title'));
$this->input->set('title', $title);
$this->input->set('subtitle', $title); //OR
$this->input->set('coll5', $title); //OR autres titres
$sql2 .= ('(`book`.`title` LIKE "%' . $title . '%") OR ');
$sql2 .= ('(`book`.`subtitle` LIKE "%' . $title . '%") OR ');
$sql2 .= ('(`book`.`coll5` LIKE "%' . $title . '%") OR ');
if(substr($sql2,-3) == ' OR '){
$sql2 = substr($sql2,0,-3);
}else{
$sql2 = substr($sql2,0,-4);
}
}
//Requete SQL ?
$sqli2 = "((SELECT COUNT(*) FROM `#__nglibrary_books` AS book WHERE $sql2) >= '1')";
$this->input->set('_outerGlue','AND');
$sqli = "((SELECT COUNT(*) FROM `#__nglibrary_copies` AS copie WHERE $sql) >= '1')";
$query->Where($sqli2,$outerGlue);
$query->Where($sqli);
return;
}
}else{
/**
* Convert simple search to normal one
*/
if ($search = $this->input->get('search', null, 'string'))
{
if ($this->input->get('title') == 'Y')
{
//j'enleve les prefixes du titre pour la recherche
$search = preg_replace ("#^(le |la |les |LE |LA |LES )#","",$search);
$this->input->set('title', $search);
$this->input->set('subtitle', $search); //OR
$this->input->set('coll5', $search); //OR autres titres
}
if ($this->input->get('isbn') == 'Y')
{
$this->input->set('isbn', $search);
}
if ($this->input->get('serie') == 'Y')
{
$this->input->set('serie', $search);
}
if ($this->input->get('collection') == 'Y')
{
$this->input->set('collection', $search);
}
if ($this->input->get('interest') == 'Y')
{
$this->input->set('coll7', $search);
}
if ($this->input->get('topic') == 'Y')
{
$this->input->set('coll6', $search);
}
if ($this->input->get('resume') == 'Y')
{
$this->input->set('resume', $search);
}
if ($this->input->get('cote') == 'Y')
{
$this->input->set('copies', ['cote' => $search]);
}
if ($this->input->get('editor') == 'Y')
{
$this->input->set('editor', ['title' => $search]);
}
if ($this->input->get('origin') == 'Y')
{
$this->input->set('copies',['origin' => $search]);
}
if ($this->input->get('author') == 'Y')
{
//Il faut creer une table avec chaque terme et effectuer une recherche de ceux ci
$search = preg_split("/[\s,]+/",$search);
$this->input->set('authors', ['title' => $search]);
}
if ($this->input->get('exemplaire') == 'Y')
{
$this->input->set('copies', ['number' => $search]);
}
}
/**
* Manage createOn using 'days'
*/
if ($this->input->get('days') >= 1)
{
$today = date('Y-m-d');
$days = date('Y-m-d', strtotime($today. ' -'. $this->input->get('days') .' days'));
$created_on['method'] = 'between';
$created_on['from'] = $days;
$created_on['to'] = $today;
$this->input->set('created_on', $created_on);
}
/**
* Handle relations filter
* - Level 1 relations, using FOF
* - Level 2 relations, using Joomla
*/
if (($editor = $this->getState('editor'))
&& array_filter($editor))
{
$this->whereHas('editor', function(\JDatabaseQuery $q) use ($editor) {
$q->where('`title` = "' . $editor['title'] . '"');
});
}
if ($author_adv = $this->getState('author_adv'))
{
//Il faut creer une table avec chaque terme et effectuer une recherche de ceux ci
$authors = preg_split("/[\s,]+/",$author_adv);
$this->input->set('authors', ['title' =>$authors]);
}
if (($authors = $this->getState('authors'))
&& array_filter($authors))
{
$this->whereHas('authors', function(\JDatabaseQuery $q) use ($authors)
{
if (!empty($authors['title']))
foreach ($authors['title'] as $searchauth)
$q->extendwhere('AND','`title` LIKE "%' . $searchauth . '%"','OR');
if (!empty($authors['id']))
$q->extendwhere('AND','`pivotTable`.`nglibrary_author _id` = ' . $q->q($authors['id']) . '','OR');
});
}
}
}
Voisi le resultat de la requete :
SELECT *
FROM nr3zk_nglibrary_books AS book
WHERE ((SELECT COUNT(*)
FROM `nr3zk_nglibrary_books` AS book WHERE (`book`.`title` LIKE "%tintin%") OR (`book`.`subtitle` LIKE "%tintin%") OR (`book`.`coll5` LIKE "%tintin%")) >= '1')
OR
((SELECT COUNT(*) FROM `nr3zk_nglibrary_copies` AS copie WHERE (`copie`.`origin` LIKE "La Ferté Fresnel - Fonds Propre%") AND (`copie`.`nglibrary_library_id` = 2) ) >= '1')
OR (`book`.`title` LIKE '%tintin%') OR (`book`.`subtitle` LIKE '%tintin%') OR (`book`.`coll5` LIKE '%tintin%')
ORDER BY `title` ASC,`title` ASC LIMIT 20
Si par hasard l'un d'entre vous avez un exemple de page de recherche avancée sur plusieurs tables SQL je suis preneur.
merci à vous
Commentaire