Normally, if an application only operates the same database (or distributed database), you only need to define the database connection information in the project configuration file. The multi-database operation mentioned here generally refers to operating different databases (including databases of the same type and different types) in one application, and even includes dynamic switching of multiple databases.
For earlier versions of ThinkPHP, switching databases required the use of advanced models, but the current 3.1 version can be solved more easily.
The new version supports multiple data in the following ways. Developers can choose the appropriate method according to the actual situation:
1. Model definition database
If it is just a simple cross-library operation and only a few model classes, you can directly define the dbName attribute in the model class:
protected $dbName = 'top';
When instantiating, remember to use the D method, for example:
$User = D('User');
The premise of this definition is that the current database user account has the permission to operate the top database.
2. Model definition database connection
If your cross-database operation requires using different database connection accounts or connecting to different types of databases, you can directly define the connection attribute in the model class. When operating the model class, it will automatically connect to the specified database. . For example:
protected $connection = 'mysql://root:1234@localhost:3306/thinkphp';
Or use array method to define:
protected $connection = array( 'db_type' => 'mysql', 'db_user' => 'root', 'db_pwd' => '1234', 'db_host' => 'localhost', 'db_port' => '3306', 'db_name' => 'thinkphp' );
If we have configured additional database connection information in the configuration file, for example:
//数据库配置1 'DB_CONFIG1' = array( 'db_type' => 'mysql', 'db_user' => 'root', 'db_pwd' => '1234', 'db_host' => 'localhost', 'db_port' => '3306', 'db_name' => 'thinkphp' ), //数据库配置2 'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp';
Then, we can change the attribute definition of the model class to:
//调用配置文件中的数据库配置1 protected $connection = 'DB_CONFIG1';
or:
//调用配置文件中的数据库配置2 protected $connection = 'DB_CONFIG2';
The advantage of this method is that it can support different database types, which means it can be different from the database type in the current project configuration file. The disadvantage is that it must be instantiated using the D method and cannot be set dynamically.
3. Model instantiation specifies the connection
The new version supports specifying the database connection when instantiating the model, for example:
$User = new Model('User','think_','mysql://root:1234@localhost/thinkphp');
Or instantiate using M method:
$User = M('User','think_','mysql://root:1234@localhost/thinkphp');
The second parameter of the M method is the prefix of the data table. If left blank, it means that the data table prefix of the project configuration is used. The third parameter is the database connection information required for the current instantiation.
In the same way, the database connection information passed in during instantiation can also be configured as a name, for example:
$User = M('User','think_','DB_CONFIG2');
If the current operation does not require switching the database connection, but only needs to switch the database, you can use:
$User = M('top.User','think_');
represents the think_user data table that instantiates the top database. If your data table does not have a prefix, you can use
$User = M('top.User',null);
represents the user table that instantiates the top database.
4. Dynamically switch connections
The system also provides more flexible dynamic operations. You can use the db method provided by the model class to perform multi-database connection and switching operations. Usage:
Model->db("数据库编号","数据库配置");
The database number is in numeric format. For the database connection that has been called, there is no need to pass in the database connection information, the system will automatically record it. For initialized database connections, the internal database number is 0, so in order to avoid conflicts, please do not define the database configuration with database number 0 again.
The database configuration is defined in the same way as the model definition connection attribute, supporting three formats: array, string, and calling configuration parameters.
After the Db method is called, the current model instance is returned, and you can directly continue to perform other operations on the model, so this method can be dynamically switched during the query process, for example:
$this->db(1,"mysql://root:123456@localhost:3306/test")->query("查询SQL");
This method adds a database connection numbered 1 and automatically switches to the current database connection.
When switching to the same database for the second time, there is no need to pass in the database connection information, you can use it directly:
$this->db(1)->query("查询SQL");
Before switching the database again, all current operations are for the database set by db(1).
If you need to switch to the default database connection, just call:
$this->db(0);
If we have defined other database connection information in the project configuration, we can directly call the configuration in the db method to connect:
$this->db(1,"DB_CONFIG1")->query("查询SQL"); $this->db(2,"DB_CONFIG2")->query("查询SQL");
If the data table is inconsistent with the current one after switching the database, you can use the table method to specify the data table to be operated on:
$this->db(1)->table("top_user")->find();
If you want to return the current database connection, you can directly call the empty db method, for example:
$db = $this->db();