Je pense avoir réussi à contourner le problème en y allant un peu brutalement. Voici le code :
Code PHP :
<?php
function Get_available_knowledges()
{
// On va chercher les savoirs disponibles.
// Les savoirs disponibles répondent a toutes les conditions de liaison et de descendance des autres savoirs
// Il faut d'abord récupérer tous les savoirs détenus par un country
$fief = $this->session->userdata('current_view_fief');
$available_knowledges = $this->db->query("
SELECT knowledge.id
FROM utg_knowledge knowledge
WHERE knowledge.active = 1
AND knowledge.id
IN (
SELECT utg_knowledge_links.id_knowledge_child
FROM utg_knowledge_links
WHERE utg_knowledge_links.id_knowledge_parent
IN (
SELECT ALL utg_country_knowledge.id_knowledge
FROM utg_country_knowledge
WHERE utg_country_knowledge.id_country = $fief
)
)
AND knowledge.id
NOT IN (
SELECT utg_country_knowledge.id_knowledge
FROM utg_country_knowledge
WHERE utg_country_knowledge.id_country = $fief
)
");
// On va tester tous les enfants pour s'assurer qu'on a bien tous les parents
$liste_rouge = array(); // Les child Evil
$liste_verte = array(); // Les child Good
$count_rouge = 0;
$count_vert = 0;
// On va tester tous les résultats
foreach($available_knowledges->result() as $row)
{
$child = $row->id;
if(!in_array($child, $liste_rouge))
{
$query = $this->db->query("
SELECT id_knowledge_parent
FROM utg_knowledge_links
WHERE id_knowledge_parent = $child
");
if($query == TRUE)
{
foreach($query->result() as $row)
{
$parent = $row->id_knowledge_parent;
$query2 = $this->db->query("
SELECT id_knowledge
FROM utg_country_knowledge
WHERE id_country = $fief
AND id_knowledge = $parent
");
if($query2 != TRUE)
{
$liste_rouge[$count_rouge] = $child;
$count_rouge++;
}
}
if(!in_array($child, $liste_rouge))
{
$liste_verte[$count_vert] = $child;
$count_vert++;
}
}
}
}
// On a donc la liste des child valides (liste verte)
// On va reconstruire une requête pour récupérer les informations des child de la liste verte
$query = "
SELECT knowledge.id, knowledge.name, knowledge.family, knowledge.description, knowledge.img_url,
knowledge.time_to_discover, knowledge.price
FROM utg_knowledge knowledge ";
$count = 0;
foreach($liste_verte as $key=>$row)
{
if(!in_array($row, $liste_rouge))
{
if($count == 0)
{
$query = $query."WHERE knowledge.id = $row ";
}
if($count !=0)
{
$query = $query."AND knowledge.id = $row ";
}
}
$count++;
}
// On envoie finalement la requête
$available_knowledges = $this->db->query($query);
return $available_knowledges;
}
Je testerai ce soir si ce code fonctionne ^^