2015-05-01 17 views
12

Sto provando a connettermi a più database in cakephp 3. Ho provato molte volte ma tutte le domande e le risposte sono in cakephp 2. Ho trovato Configuring Connections alla documentazione cakephp 3. Ma non riesco a capirlo.Connessione a più database in cakephp 3

Ho due banche dati:

1. tracking_system 
    (Tables: trackers, events, etc..) 
2. tracking_system_2 
    (Tables: todos, actions, etc..) 

Lavorare con i database di tracking_system è completamente in funzione. Ma non so, come collegarmi a più database (nel mio caso, con il secondo database tracking_system2).

Grazie in anticipo per l'aiuto.

+0

@Abhishek: Grazie amico. –

+0

I documenti sono abbastanza chiari su come fare in modo che le tabelle utilizzino connessioni specifiche, quindi dovresti essere un po 'più specifico su quale sia esattamente il tuo problema, cosa esattamente non capisci, "_I do not understand_" non è utile, e "_Non so come connettere ..._" potrebbe significare qualsiasi cosa. – ndm

+0

@ndm puoi aggiungere un link al documento dove Jigar può dare un'occhiata. – shadab

risposta

7

È possibile dichiarare il metodo defaultConnectionName() nelle tabelle che utilizzeranno per impostazione predefinita un'altra connessione. In nessuna delle vostre classi Tabella:

public static function defaultConnectionName() 
{ 
    return 'another_config_name'; 
} 
+5

defaultConnection() non ha funzionato per me. defaultConnectionName() ha fatto. –

+0

La documentazione indica chiaramente defaultConnection ** Name **() come nome della funzione. Altra cosa deve essere una funzione statica. – DecoMartins

7

ricevo una soluzione del mio problema. E sta funzionando bene. Si prega di fare riferimento al codice sottostante e commentare se ho torto in qualsiasi luogo.

->app.php

'Datasources' => [ 
'default' => [ 
    'className' => 'Cake\Database\Connection', 
    'driver' => 'Cake\Database\Driver\Mysql', 
    'persistent' => false, 
    'host' => 'localhost', 
    //'port' => 'nonstandard_port_number', 
    'username' => 'your_username', 
    'password' => 'your_password', 
    'database' => 'tracking_system', // This is my default database 
    'encoding' => 'utf8', 
    'timezone' => 'UTC', 
    'cacheMetadata' => true, 
    'quoteIdentifiers' => false, 
    //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], 
], 

'db2' => [ 
    'className' => 'Cake\Database\Connection', 
    'driver' => 'Cake\Database\Driver\Mysql', 
    'persistent' => false, 
    'host' => 'localhost', 
    //'port' => 'nonstandard_port_number', 
    'username' => 'your_username', 
    'password' => 'your_password', 
    'database' => 'tracking_system2', // This is my second database 
    'encoding' => 'utf8', 
    'timezone' => 'UTC', 
    'cacheMetadata' => true, 
    'quoteIdentifiers' => false, 
    //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], 
] 
] 

->TodolistsController.php

database name: tracking_system2 

table name: todolists 
  • aggiungere questa linea al vostro controller

utilizzare Cake \ Datasource \ ConnectionManager;

mio codice TodolistsController.php è:

<?php 
namespace App\Controller; 
use App\Controller\AppController; 
use Cake\ORM\TableRegistry; 
use Cake\ORM\Entity; 
use Cake\Network\Exception\NotFoundException; 
use Cake\Datasource\ConnectionManager; // This line is required 

class TodolistsController extends AppController 
{ 
public function todoadd(){ 
    $connection = ConnectionManager::get('db2'); // 'db2' where my second database is configured 
    $results = $connection->execute('SELECT * FROM todolists')->fetchAll('assoc'); 
    $this->set('results', $results); 
    if($this->request->is('post')){ 
     $connection->insert('todolists', [ 
      'title' => $this->request->data['title'], 
      'description' => $this->request->data['description'] 
     ]); 
     $this->redirect($this->referer); 
    } 
} 
} 

->TodolistsTable.php

<?php 
namespace App\Model\Table; 
use Cake\ORM\Table; 

class TodolistsTable extends Table 
{ 
    public static function defaultConnectionName() 
    { 
     return 'db2'; 
    } 
    public function initialize(array $config) 
    { 
     $this->addBehavior('Timestamp'); 
    } 
} 

Questo è tutto.

Grazie ...

+0

Inserire il codice SQL nel controller è contro la logica del modello. Non dovresti mai scrivere il tuo codice SQL in CakePHP se non in casi molto speciali. I metodi del modello forniscono tutte le funzionalità di cui avresti maggiormente bisogno. –

-1

È possibile avere una prova con la proprietà modello useDbConfig se funziona per voi.

 
class Example extends AppModel { 
    public $useDbConfig = 'default1DbConfigSettings'; //The useDbConfig property is defaulted to the ‘default’ database connection. 
} 
+1

Questa non è una domanda su Cake2. – makallio85

0

Per attivare il database per il modello,

utilizzare il dominio nel controller/modello

use Cake\Datasource\ConnectionManager; 

In controllore; -

$conn = ConnectionManager::get('remote_db_1'); 
$this->ModelName->connection($conn); 

Nel modello: -

$conn = ConnectionManager::get('remote_db_1'); 
$this->connection($conn); 

Nota: - Se si sta salvando i dati per le tabelle collegate troppo, poi tenere in mente di cambiare il DB per i dati associati altrimenti i dati per la tabella associata verrà inserito nel connessione predefinita/DB.

Questa è la risposta per CakePHP 3. *