IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Comment faire une recherche sur plusieurs tables


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 65
    Points : 30
    Points
    30
    Par défaut Comment faire une recherche sur plusieurs tables
    Bonjour,
    J'ai essayé d'appliquer le même principe de la recherche utilisée dans le tutoriel de Jobeet.
    Le seule différence est que je veux faire une recherche sur plusieurs tables et non pas une seule(le cas de jobeet).
    Pouvez vous me m'aider par vos idées pour savoir comment je peux faire un moteur de recherche sur plusieurs tables de la base de données pour obtenir un résultat satisfaisant?
    Merci.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Au pire tu peux toujours créer un vue de données au niveau de MySQL masi ce n'est qu'une façon de contourner le problème.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Toute tes données sont chargés à l'écran et tu voudrais faire un tri avec un champ recherche, c'est ca ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    Bonjour,
    J'ai un probléme de réaliser le moteur de recherche via une seule table dans la BDD(pour le moment.
    En effet,j'ai ajouté la classe suivante à mon fichier projectConfiguration.class.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class ProjectConfiguration extends sfProjectConfiguration
    {
      public function setup()
      {
        // for compatibility / remove and enable only the plugins you want
        $this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
      }
      static protected $zendLoaded = false;
     
      static public function registerZend()
      {
        if (self::$zendLoaded)
        {
          return;
        }
     
        set_include_path(sfConfig::get('sf_lib_dir').'/vendor'.PATH_SEPARATOR.get_include_path());
        require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/Autoloader.php';
        Zend_Loader_Autoloader::getInstance();
        self::$zendLoaded = true;
      }
    }
    .
    Ensuite,j'ai ajouté le code suivant à mon fichier AnapathTable.class.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    static public function getLuceneIndex()
    {
      ProjectConfiguration::registerZend();
     
      if (file_exists($index = self::getLuceneIndexFile()))
      {
        return Zend_Search_Lucene::open($index);
      }
      else
      {
        return Zend_Search_Lucene::create($index);
      }
    }
     
    static public function getLuceneIndexFile()
    {
      return sfConfig::get('sf_data_dir').'/anapath.'.sfConfig::get('sf_environment').'.index';
    }
    .
    Ensuite j'ai ajouté le script suivant à mon fichier Anapath.class.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public function save(Doctrine_Connection $conn = null)
    {
      $conn = $conn ? $conn : AnapathTable::getConnection();
      $conn->beginTransaction();
      try
      {
        $ret = parent::save($conn);
     
        $this->updateLuceneIndex();
     
        $conn->commit();
     
        return $ret;
      }
      catch (Exception $e)
      {
        $conn->rollBack();
        throw $e;
      }
    }
    public function updateLuceneIndex()
    {
      $index = AnapathTable::getLuceneIndex();
     
      // remove existing entries
      foreach ($index->find('pk:'.$this->getId()) as $hit)
      {
        $index->delete($hit->id);
      }
     
     
     
      $doc = new Zend_Search_Lucene_Document();
     
      // store anapath primary key to identify it in the search results
      $doc->addField(Zend_Search_Lucene_Field::Keyword('pk', $this->getId()));
     
      // index anapath fields
      $doc->addField(Zend_Search_Lucene_Field::UnStored('poids', $this->getPoids, 'utf-8'));
      $doc->addField(Zend_Search_Lucene_Field::UnStored('gleason', $this->getGleason(), 'utf-8'));
      $doc->addField(Zend_Search_Lucene_Field::UnStored('gleason_max', $this->getGleasonMax(), 'utf-8'));
      $doc->addField(Zend_Search_Lucene_Field::UnStored('gleason_tertiaire', $this->getGleasonTertiaire(), 'utf-8'));
     
      // add anapath to the index
      $index->addDocument($doc);
      $index->commit();
    }
    public function delete(Doctrine_Connection $conn = null)
    {
      $index = AnapathTable::getLuceneIndex();
     
      foreach ($index->find('pk:'.$this->getId()) as $hit)
      {
        $index->delete($hit->id);
      }
      return parent::delete($conn);
    }
    J'ai ajouté dans mon fichier routing.yml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    anapath_search:
      url:   /search
      param: { module: anapath, action: search }
    Ensuite dans le fichier action.class.php j'ai ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function executeSearch(sfWebRequest $request)
      {
        if (!$query = $request->getParameter('query'))
        {
          return $this->forward('anapath', 'index');
        }
     
        $this->anapaths = Doctrine::getTable('Anapath') ->getForLuceneQuery($query);
      }
    .
    J'ai ajouté aussi le template searchSuccess.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div id="anapaths">
      <?php include_partial('anapath/list', array('anapaths' => $anapaths)) ?>
    </div>
    Le fichier AnapathTable.Class.php est modifié de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public function getForLuceneQuery($query)
    {
      $hits = $this->getLuceneIndex()->find($query);
     
      $pks = array();
      foreach ($hits as $hit)
      {
        $pks[] = $hit->pk;
      }
     
      if (empty($pks))
      {
        return array();
      }
     
      $q = $this->createQuery('j')
        ->whereIn('j.id', $pks)
        ->limit(20);
      //$q = $this->addActiveJobsQuery($q);
     
      return $q->execute();
    }
    .
    Enfin dans le layout,j'ai ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <li <?php if($sf_user->getAttribute('menu') == 3) echo 'class="active"'; ?>><a href="<?php echo url_for('@anapath_search') ?>">Search</a>
     
    <form action="<?php echo url_for('@anapath_search') ?>" method="get">
      <input type="text" name="query" value="<?php echo $sf_request->getParameter('query') ?>" id="search_keywords" />
      <input type="submit" value="search" />
     
    </form>
     
    			</li>
    .
    Mon probléme est que la recherche ne s'exécute pas.Toujours l'erreur "Action "search/index" does not exist." s'affiche.
    Pourriez vous m'aider pour résoudre ce probléme et pour faire fonctionner le moteur de recherche?

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Tu dois avoir un fichier qui s'appelle IndexSuccess dans ton dossier template. Sinon ca ne marche pas. Même un fichier vide ca fera l'affaire.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    Ci joint l'arborescence de mon module anapath qui contient l'action search.
    Images attachées Images attachées  

  7. #7
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Dans ton contrôleur (action.class.php ) ton action s'appelle Shearch (executeSearch).

    Soit tu la renommes Index (executeIndex) soit tu renommes ton url.

Discussions similaires

  1. [PDO] Comment faire une recherche sur plusieurs critères ?
    Par geeka dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/05/2015, 10h19
  2. Comment faire une recherche sur un contenu s'il existe ou non ?
    Par 21247692 dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/04/2008, 10h54
  3. Comment faire la recherche sur les tables
    Par teZone dans le forum WinDev
    Réponses: 4
    Dernier message: 23/10/2007, 15h36
  4. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 22h58
  5. [vb6]faire une requete sur plusieurs tables
    Par Henry9 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/07/2006, 02h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo