Laravel 4

Connexion à bases multiples ( SQL/php)

Avatar de CassieCroft
CassieCroft

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 ...

Posté il y a 5 ans
Avatar de bestmomo
bestmomo

Il y a un exemple ici.

Posté il y a 5 ans
Avatar de CassieCroft
CassieCroft

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;
  
}
Posté il y a 5 ans
Avatar de bestmomo
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 ? 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.

Posté il y a 5 ans
Avatar de JulienTant
JulienTant

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);
Posté il y a 5 ans
Avatar de bestmomo
bestmomo

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

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

Posté il y a 5 ans
Avatar de CassieCroft
CassieCroft

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' ;)

Posté il y a 5 ans
Avatar de FLEMO
FLEMO

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

Posté il y a 2 ans

Vous ne pouvez pas répondre à ce sujet.