【问题标题】:Slim Framework with ORM (Eloquent) connect multiple db带有 ORM (Eloquent) 的 Slim 框架连接多个数据库
【发布时间】:2015-05-23 18:50:22
【问题描述】:

我正在使用带有 Eloquent 4.1.x 的 Slim 框架作为项目的 ORM,并且需要连接到多个数据库。

我按照link 设置了 ORM。但是如何按照给定的教程连接到多个数据库?

在我的模型中,我有不同的文件用于不同数据库中的不同表。

就像User.php文件有以下内容,

<?php
namespace Service\Framework\Model;

use Illuminate\Database\Eloquent\Model;

class Users extends Model {
  protected $table = 'users';
}

该类使用 db_2 数据库中的 users 表。我想在这个类的一个方法中从默认数据库 db_1 切换。喜欢,

<?php

namespace Service\Framework\Model;

use Illuminate\Database\Eloquent\Model;

class Users extends Model {
  protected $table = 'users';

  public function getUsers() {
    // Switch the database to db_2
    $users = self::all();
    // Again switch back to default database db_1
    return $users;
  }
}

我该怎么做?请帮我提些建议。

P.S:我这里没有使用 Capsule。

编辑 #1 所以我用来设置单个连接的代码如下,

$settings = array(
      'driver' => 'mysql',
      'host' => 'localhost',
      'database' => 'db_1',
      'username' => 'dbuser',
      'password' => 'password',
      'charset'  => 'utf8',
      'collation' => 'utf8_general_ci',
      'prefix' => ''
    );

    // Bootstrap Eloquent ORM
    $container = new Container();
    $connFactory = new ConnectionFactory($container);
    $conn = $connFactory->make($settings);
    $resolver = new ConnectionResolver();
    $resolver->addConnection('default', $conn);
    $resolver->setDefaultConnection('default');
    Model::setConnectionResolver($resolver);

【问题讨论】:

    标签: orm eloquent slim multiple-databases


    【解决方案1】:

    您可以使用此简化代码连接到多个数据库:

    $app = new \Slim\App([
        'db' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'products',
            'username'  => 'user',
            'password'  => 'pass',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ],
        'db_second' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'second',
            'username'  => 'user',
            'password'  => 'pass',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ],
    ]);
    
    $container = $app->getContainer();
    
    // connect to db with Illuminate larvel
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($container['settings']['db']);
    $capsule->addConnection($container['settings']['db_second'], 'db_second');
    $capsule->setAsGlobal();
    $capsule->bootEloquent();
    /// END connect to db
    
    // to accsess the $capsule with our container from our controllers
    $container['db'] = function($container) use ($capsule){
        return $capsule;
    };
    

    并在模型文件中放入:

    protected $connection = 'db_second';
    

    【讨论】:

      【解决方案2】:

      首先您应该设置多个连接。建立连接后,您可以指示模型使用具有$connection 属性的特定连接。

      namespace Service\Framework\Model;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Users extends Model {
        protected $connection = 'mysql2';
        protected $table = 'users';
      }
      

      在路由或控制器中,您可以使用setConnection() 方法。

      $user = new User;
      $user->setConnection('mysql2');
      print_r($user->find(1));
      

      【讨论】:

      • 谢谢迈克,不过有一个问题。如何使用我正在使用的代码设置多个连接?有什么猜测吗?我已经用代码 sn-p 更新了我的问题。请提出建议。
      • 我并没有真正使用 Eloquent,但很可能通过创建另一个 $conn 对象来查看代码,例如具有不同 $settings 的 $conn2。然后调用类似 $resolver->addConnection('mysql2', $conn2);
      • 迈克,是的,这解决了我的问题。虽然后来我不得不使用 Capsule,但基本思想是一样的。
      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多