Laravel入门教程(五)- 数据库操作 - Eloquent ORM

1. Eloquent ORM简介及查询数据

1.1. Eloquent ORM简介

ActiveRecord实现

ActiveRecord:

1.2. 创建模型并关联数据库表

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    // 指定表名,默认是Student的复数
    protected $table = 'student';
    // 指定id
    protected $primaryKey = 'id';
}

1.3. 查询数据

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm1()
    {
        // 查看Student表所有的信息
        $student = Student::all();
        dd($student);

        // 查看Student表中id=1001对应的数据,找不到返回NULL
        $student = Student::find(2001);
        dd($student);

        // 查看Student表中id=2001对应的数据,找不到出错
        $student = Student::findOrFail(1001);
        dd($student);

        // 查看表的所有记录
        $student = Student::get();
        dd($student);

        // 排序,条件,取第一个
        $student = Student::where('id', '>', '1001')
            ->orderBy('age', 'DESC')
            ->first();
        dd($student);

        // 使用chunk
        Student::chunk(2, function($students){
            var_dump($students);
        });

        // 聚合函数
        $qty = Student::count();
        dd($qty);
    }
}

2. ORM中新增数据

  • 通过模型新增数据(涉及到自定义时间戳)
  • 使用模型的Create方法新增数据(涉及到批量赋值)

2.1. 通过模型来新建记录

在Controller中,设置:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm2()
    {
        // 通过模型来新建记录
        $student = new Student();
        $student->name = 'Belle';
        $student->age = 18;
        $bool = $student->save();
        dd($bool);

        $student = Student::find(1009);
        echo $student->created_at;
        // 显示: 1489460962(需要设置:asDateTime)

    }
}

在Model中设置:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    // ... 省略了部分代码

    // 自动维护时间戳(timestamp)
    public $timestamps = TRUE; // FALSE 不维护时间戳| TRUE 维护

    protected function getDateFormat(){
        return time();
    }

    // 如果需要显示的是时间戳
    protected function asDateTime($val)
    {
        return $val;
    }
}

2.2. 使用模型的Create方法

Controller中设置:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm2()
    {
        // 使用模型的Create方法来新增数据
        // 如果不设置模型的$fillable,会抛出MassAssignmentException异常
        $student = Student::create([
            'name' => 'Candy', 
            'age' => 18]);
        dd($student);
    }
}

Model中设置:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    // ... 省略了部分代码

    // 指定允许批量赋值的字段
    protected $fillable = ['name', 'age'];

    // 指定不允许批量赋值的字段
    protected $guarded = [];

}

2.3. firstOrCreate方法

特别适合的情况就是新增的同时保证不会出现重复

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm2()
    {
        // firstOrCreate() 
        $student = Student::firstOrCreate(
            ['name' => 'Elsa']
            );
        dd($student);
    }
}

2.4. firstOrNew方法

firstOrNew()与firstOrCreate()的区别是:firstOrNew不会自动保存到数据库。需要手动调用save()方法来保存。

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm2()
    {
        // firstOrNew()
        // firstOrNew()与firstOrCreate()的区别是:firstOrNew不会自动保存到数据库
        // 需要手动调用save()方法来保存
        $student = Student::firstOrNew(
            ['name' => 'Linda']
            );
        $bool = $student->save();
        dd($bool);
    }
}

3. 更新数据

3.1. 利用模型更新数据

在Controller中更改,最后用save()保存

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm3()
    {
        // 通过模型更新数据
        $student = Student::find(1010);
        $student->name = 'Cindy';
        $bool = $student->save(); // updated_at也会改变
    }
}

TODO: 如何设置要更新的时间戳字段?

3.2. 利用update()函数

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm3()
    {
        // 使用update()函数批量更新
        $qty = Student::where('id', '>', 1011)->update(['age'=>21]);
        var_dump($qty);
    }
}

4. 删除数据

4.1. 通过模型删除数据

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm3()
    {
        // 通过模型删除
        $student = Student::find(1009);
        $bool = $student->delete(); 
        var_dump($bool);
    }
}

4.2. 通过主键删除

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm3()
    {
        // 通过主键删除
        $qty = Student::destroy([1010, 1012]);
        var_dump($qty);
    }
}

4.3. 指定条件删除

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Student;

class StudentController extends Controller
{
    public function orm3()
    {
        // 指定条件删除
        $qty = Student::where('id', '>' , '1010')->delete();
        var_dump($qty);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值