Laravel 4

Connexion à bases multiples ( SQL/php)

  • Avatar de CassieCroft
    Membre depuis :
    15/04/2014
    Messages :
    3

    Bonjour,
    je suis actuellement entrain de développer une application web permettant la gestion de plusieurs bases de données. Malheureusement je n'arrive pas à me connecter à plusieurs BDD en même temps.
    Je vous donne des morceaux de code en espérant que les erreurs se trouvent dans ces parties.

    PS: j'utilise Eloquent,Slim et Twig

    <?php

    namespace modele;
    use Illuminate\Database\Capsule\Manager as DB;

    class orm{
       
       public static function demarrage(){
       
           $caps = new DB;
           $param = parse_ini_file("param.ini");
           $caps->addConnection($param);
           $caps->setAsGlobal();
           $caps->bootEloquent();

       }
    }
    ?>

    et le param.ini

    driver = mysql
    host = localhost
    database = View1
    database = View2
    username =
    password =

    charset = utf8
    collation = utf8_unicode_ci
    prefix =

    j'ai testé énormément de chose je vous donnes les codes de bases sans modifications si vous avez des idées ...

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2299

    Il y a un exemple ici.

  • Avatar de CassieCroft
    Membre depuis :
    15/04/2014
    Messages :
    3

    Merci, pour ta réponse malheureusement cela ne fonctionne toujours pas. J'ai réalisé un exemple simple 2 BDD différentes avec chacune une table.
    Mais à chaque j'obtiens ce message d'erreur :

    Slim Application Error

    The application could not run because of the following error:
    Details
    Type: InvalidArgumentException
    Message: Database [mysql2] not configured.
    File: /Applications/MAMP/htdocs/Test3/vendor/illuminate/database/Illuminate/Database/DatabaseManager.php
    Line: 184

    Je vous donne les morceaux de code que je pense concerné par ce problème, je pense ne pas être loin de la solution mais une subtilité m'échappe.

    namespace modele;

    use Illuminate\Database\Capsule\Manager as DB;

    class orm {

    public static function demarrage() {
    $caps = new DB;
    $param = array(
    'default' => 'mysql',
    'connections' => array(
    'mysql' => array(
    'driver' => 'mysql',
    'host' => 'localhost',
    'database' => 'View1',
    'username' => '',
    'password' => '
    ',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    ),
    'mysql2' => array(
    'driver' => 'mysql',
    'host' => 'localhost',
    'database' => 'View2',
    'username' => '',
    'password' => '
    ',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    ),
    ),
    );
    $caps->addConnection($param);
    $caps->setAsGlobal();
    $caps->bootEloquent();
    }
    }

    Le code rentre bien ici mais j'ai l'impression qu'il ne comprends pas le contenu $param

    Le contrôleur :

    class Controllerpersonneadressecd extends Controller {

    public function All($app){
    \modele\orm::demarrage();
    $adresse = new personneadressecd();
    $adresse->setConnection('mysql2');
    $adresse = \modele\personneadressecd::all();
    return $adresse->toJson();
    }

    le modele :

    class personneadressecd extends \Illuminate\Database\Eloquent\Model{
    protected $connection = 'mysql2';
    protected $table = 'PersonneAdresseCD';
    protected $primaryKey = 'idActeur';
    public $timestamps=false;

    }
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2299

    Salut,

    Pourquoi ne pas renseigner tes connexions directement dans le fichier de configuration et y faire appel comme dans l'exemple dont je t'avais donné le lien ? Sinon la méthode addConnection attend juste un tableau pour une connexion, pas deux. Donc elle digère mal ce que tu lui donnes. A priori tu dois pouvoir enregistrer tes deux connexions successivement en les nommant avec le deuxième paramètre (sinon il prend la valeur par défaut de la configuration).

    D'autre part si utilises plusieurs fois ta classe tu devrais la déclarer en singleton.

  • Avatar de JulienTant
    Membre depuis :
    26/03/2013
    Messages :
    465

    bestmomo :Salut,

    Pourquoi ne pas renseigner tes connexions directement dans le fichier de configuration et y faire appel comme dans l'exemple dont je t'avais donné le lien ?

    Car il utilise le Framework Slim et pas Laravel :)

    Tu peux suivre le lien suivant pour une installation "propre" dans le framework Slim : http://www.slimframework.com/news/slim-and-laravel-eloquent-orm

    Ta petite particularité se trouve dans la partie "BOOTSTRAP THE ELOQUENT ORM". Tu devrais sans doute modifier le second bloc de code pour avoir :

    $connFactory = new \Illuminate\Database\Connectors\ConnectionFactory();
    $resolver = new \Illuminate\Database\ConnectionResolver();

    $conn1 = $connFactory->make($tableauDeLaConnection1);
    $resolver->addConnection('mysql', $conn1);

    $conn2 = $connFactory->make($tableauDeLaConnection2);
    $resolver->addConnection('mysql2', $conn2);

    $resolver->setDefaultConnection('mysql');
    \Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver);
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2299

    AoSiX :
    Car il utilise le Framework Slim et pas Laravel :)

    Oups ! Oui j'avais pas assez bien lu les messages d'erreurs :O.

  • Avatar de CassieCroft
    Membre depuis :
    15/04/2014
    Messages :
    3

    Bonjour,
    merci de toutes vos réponses, malheureusement la doc Slim n'est plus à jour et leur exemple ne fonctionne plus. Ils ont en effet supprimé le constructeur vide de connectionFactory ( d'ou mes 3 heures de galère )
    donc ce code ne fonctionne plus :

    $connFactory = new \Illuminate\Database\Connectors\ConnectionFactory();
    $resolver = new \Illuminate\Database\ConnectionResolver();

    $conn1 = $connFactory->make($tableauDeLaConnection1);
    $resolver->addConnection('mysql', $conn1);

    $conn2 = $connFactory->make($tableauDeLaConnection2);
    $resolver->addConnection('mysql2', $conn2);

    $resolver->setDefaultConnection('mysql');
    \Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver);

    Il faut rajouter une ligne et un paramètre  :

           $test = new \Illuminate\Container\Container();
           $connFactory = new \Illuminate\Database\Connectors\ConnectionFactory($test);
    $resolver = new \Illuminate\Database\ConnectionResolver();

    $conn1 = $connFactory->make($tableauDeLaConnection1);
    $resolver->addConnection('mysql', $conn1);

    $conn2 = $connFactory->make($tableauDeLaConnection2);
    $resolver->addConnection('mysql2', $conn2);

    $resolver->setDefaultConnection('mysql');
    \Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver);

    Mais en tout cas encore merci, je n'aurais pas résolu mon problème de double BDD sans vous.

    PS: ce n'est pas 'il utilise' mais 'elle utilise' ;)

  • Avatar de FLEMO
    Membre depuis :
    03/01/2018
    Messages :
    8

    Bonjour je voudrais appeler ma base de données dans mes page et ausssi dans les div j'y arrive pas. merci pour votre avis ou code complet qui pourrait me help. J'ai essayé toutes sortes de combinaison mais cela ne passe voici le code qui permet de me connecter a ma base :
    $pdo = new PDO('mysql:host=localhost;dbname=rfu','root','');
    et voici mon code au complet qui marche bien
    <?php

    $pdo = new PDO('mysql:host=localhost;dbname=foncier','root','');
    $resultats = $pdo->query("SELECT (batie) FROM tests WHERE tole = 'Non' ");
    $rows = $resultats->fetchAll();
    $num_rows = count($rows);

    echo ''.$num_rows.' non tole(s)';
    ?>

Vous ne pouvez pas répondre à ce sujet.