欢迎各位兄弟 发布技术文章
这里的技术是共享的
Laravel 支持4种数据库:
Laravel 对数据库库的操作方式一共有3种:
其中第一,第二种,都是对数据表进行操作,第一种是写原生的SQL语句,第二种是用Laravel封装的方法对数据表进行操作(这些方法最终会转化为SQL语句)。
而第三种方法,也就是Eloquent ORM,则是对模型(数据对象)进行操作,是一种完全面向对象的数据操作方式(ORM),ORM使得数据操作变得更直观,更简单,更强大,例如建立表间关系,ORM有着明显的优势。
建议先学习第一,第二种方法。在实际中使用第三种方法。
配置文件:config/database.php
找到Mysql的部分:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
我们注意到'host' => env('DB_HOST', 'localhost'),
这句,说明,.env文件有优先配置的权利,我们到.env中把数据库的关键信息填了:
DB_HOST=localhost
DB_DATABASE=larabase
DB_USERNAME=root
DB_PASSWORD=root
好了,这样就行了,你已经可以连接和使用数据库了。
为了提高数据库读写效率,服务器常常会进行读写分离的部署:
在laravel中配置读写分离超级简单:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
看到读(read)写(write)两个字了吗,在下面配置服务器信息就OK了,如果这两个数据库有共用的信息,你可以把它们写在外面,例如用户名密码这些都是读写数据库共用的。如果要使用独立的,就写到读写数组里面去。
太简单了,是因为不能更简单了。
我们先来了解一下SQL语句的分类: 首先就是对数据的操作:『查改增删』 select, update, insert, delete;
然后就是对数据表和数据结构的一些操作(statement),例如删除一个表等等。
好,我们来看看laravel中怎样写这些语句:
$users = DB::select('select * from users where active = ?', [1]);
后面那个1是参数,很好理解。
需要了解一下$users查出来的是一个什么东西,$user查出来是一个数组,数组里的每个值都是一个标准PHP对象,这样你就可以读取对象中的属性,实际用例:
foreach ($users as $user) {
//查出来后你就可以直接读取用户的名字
echo $user->name;
}
指定参数的键名
$results = DB::select('select * from users where id = :id', ['id' => 1]);
和上面写参数的方法对比一下就好,你可以看到要给参数加键名应该怎么写,这种情况适合有很多参数的情况使用。
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
显而易见,不解释了。注意后面的参数是按顺序注入的。
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
$posts = DB::delete('delete from posts where id = ?', [3]);
对于不返回任何数据的SQL,这样写:
DB::statement('drop table users');
<?php
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
DB::listen(function($sql, $bindings, $time) {
//
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
放置事件侦听的位置在provider的boot()方法里, 这玩意儿有啥用呢?看闭包里的三个参数,每次有sql语句执行的时候,你都可以在这里获得 sql具体的语句,参数,以及执行时间,你可以把它们写到log里面去,主要用来调试和debug用。 当然,我在使用了无比强大的barryvdh/laravel-debugbar
后,也就没怎么用过这个功能。
所谓transaction,就是像交易一样一笔一笔的来处理。
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
如果你需要执行多个相关语句,可以写到transaction这个闭包参数里面。它有个好处就是如果这其中任何一条sql报错,它都会回滚到初始状态,只有全部无错通过了,才会写数据库。
注意DB::transaction(function () {});
对后面要讲的QueryBuilder和Eloquent ORM也是适用的。
官网写得太简单了,看得有点晕,其实是这样的:
DB::beginTransaction();
写了这句话后,下面所有的Sql语句都不会写数据库。
除非你在最后加上:
DB::commit();
看着怎么有点像git:)
在上面两者之间的过程中,你可以用条件语句加入:
DB::rollBack();
万一有什么不测的地方,就可以回滚。
有时候想调用其他数据库的内容:
$users = DB::connection('foo')->select(...);
前提是这个'foo'数据库,你之前在配置文件中配置过。
另外,这个connection对象还可以用来返回一个PDO对象:
$pdo = DB::connection()->getPdo(); 来自 http://laravelbase.com/show/65