-->

PHP资讯

您的当前位置:首页 > 资讯 > Laravel框架

laravel整理-10模型操作

2019-06-26 11:32:09  来源:admin 点击:1468

模型简介
https://learnku.com/docs/laravel/5.8/eloquent/3931手册
创建模型:php artisan make:model Model\User\Users  创建一个模型在对应文件夹下

image.png

如果时间自动填充,则表示public $timestamps = true;

/** * 模型日期列的存储格式。 * * @var string */ protected $dateFormat = 'U';
const CREATED_AT = 'creation_date'; const UPDATED_AT = 'last_update'; }
/**
* 模型的连接名称
*/
protected $connection = 'connection-name';
Tinker
命令 php artisan tinker 开启 tinker 环境
运行模型创建数据方法为模型的操作方法:factory(App\TPUser::class,2)->create();
App\user::count();
App\user::all();
存在user模型,用命名空间
可以在命令行操作
模型操作
$flights = App\Flight::all();

foreach ($flights as $flight) {
echo $flight->name;
}
$flights = App\Flight::where('active', 1)
       ->orderBy('name', 'desc')
       ->take(10)
       ->get();
模型与db类的关系;

首先需要解释db类,DB类对于数据库操作的时候其实也主要是依托于查询构造器,而model也是如此。

所以实际上db类中使用的方法在model中也是适用的。对于讲师来说可以简单演示一些方法就可以了。

对于save,find,delete,all,toArray的使用方式。在讲解的时候一定要注意自动时间戳
的设置如果不是使用laravel所提供的数据表的话
Public function model(){
$user = User::all();//默认结果是对象
$user = User::all()->toArray();//默认结果是数组
$user = User::find(1);//查询一条,一为主键
$user = User::get();//			
$user = User::where()->get();//查询条件
// save保存
        $userModel = new User();
        $userModel->name = 'test';
        $userModel->email = '121213@163.com';
        $userModel->save();
或者
User::insert([
    'name'              => 'test',
    'email'             => '126564562@163.com',
    'email_verified_at' => now(),
    'password'          => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
    'remember_token'    => str_random(10),
]);

// Update            5
User::where('id', $userModel->id)->update(['name' => 'winner']);
或者
$userModel = User::find($userModel->id);
$userModel->email = 'qwqwqw@163.com';
$userModel->save();

// delete
User::where('id', $userModel->id)->delete();

  继承的模型

image.png

操作图

image.png

其他操作
集合
对于 Eloquent 中的 all 和 get 方法可以查询多个结果,
返回一个 Illuminate\Database\Eloquent\Collection 实例。 
Collection 类提供了 很多辅助函数 来处理 Eloquent 结果:

$flights = $flights->reject(function ($flight) {
    return $flight->cancelled;
});
你可以像数组一样遍历集合:

foreach ($flights as $flight) {
    echo $flight->name;
}  		
分块结果
如果你需要处理数以千计的 Eloquent 结果,
使用 chunk 命令。 chunk 方法会检索
 Eloquent 模型中的『分块』将他们提供给指定的 Closure 处理。
 在处理大型结果集时,使用 chunk 方法可以节省内存:

Flight::chunk(200, function ($flights) {
    foreach ($flights as $flight) {
        //
    }
});
使用游标
cursor 方法允许你使用游标遍历数据库,
它只执行一次查询。处理大量的数据时, 
cursor 方法可以大大减少内存的使用量:
foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
    //
}
// 通过主键检索一个模型...
$flight = App\Flight::find(1);

// 检索符合查询限制的第一个模型...
$flight = App\Flight::where('active', 1)->first();
你也可以使用主键数组作为参数调用 find 方法,它将返回匹配记录的集合:

$flights = App\Flight::find([1, 2, 3]);
『未找到』异常
有时你希望在未找到模型时抛出异常。这在控制器和路由中非常有用。 findOrFail 和 firstOrFail 
方法会检索查询的第一个结果,如果未找到,
将抛出 Illuminate\Database\Eloquent\ModelNotFoundException 异常:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();
如果没有捕获异常,则会自动返回 404 响应给用户。也就是说,使用这些方法时,
没有必要再写个检查来返回 404 响应::

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
});
模型操作的辅助函数,下次总结集合操作
https://learnku.com/docs/laravel/5.8/eloquent-collections/3933#available-methods
软删除
解释: 软删除就是对于一个数据假装删除
场景: 主要是应对与一些重要的数据的时候才使用,比如订单信息
操作:
首先users这个数据表添加一个 deleted_at的字段
这里可以提一下就是软删除 的默认字段是 deleted_at默认查询结果会自动剔除已被软删除的结果。当然,你可以使用 withTrashed 方法来获取包括软删除模型在内的模型:
       User::where('id', 10)->delete();
       $user = User::withTrashed()->where('id', 10)->get()->toArray();
onlyTrashed 方法 只 获取已软删除的模型:
       $user = User::onlyTrashed()->get()->toArray();
restore 方法即可恢复到有效状态
       $user = User::withTrashed()->where('id', 10)->restore();
真实删除数据时,使用 forceDelete 方法即可:
       $user = User::withTrashed()->where('id', 10)->forceDelete();

       dd($user);

image.png

image.png

image.png

模型关联
从Tp_admin 关联tp_admin_role是一对一的关系
从tp_admin_role 关联 tp_admin 是一对多的关系
定义模型:
php artisan make:model Models/Admin/AdminRole
php artisan make:model Models/Admin/Admin
image.png
模型关联一对一
Admin中关联admin_role

image.png

传到hasOne方法里的第一个参数是关联模型的类名称。定义好关联之后,就可以使用 Eloquent 的动态属性取得关联对象:

先引入模型在使用 user app\asdasdasdasdas
Users::find(293)->adminrole

image.png

注意,Eloquent假设对应的关联模型数据库表里,外键名称是基于模型名称。在这个例子里,默认adminRole模型数据库表会以admin_id作为外键,而我们实际并不是所以我们是需要自己传递参数自定义

$data = Users::with(‘userRole:role_id,role_name’)->get([‘uid’,’user_name’,role_id])->toarray();
三位数组
Illuminate\Database\Eloquent\Concerns\HasRelationships trait 中的 hasOne
我们可以浏览这个方法
$foreignkey 就是自定义关联模型的关联字段
$localkey 就是自定义当前模型的关联字段

image.png

 反向关联 要在admin_role中定义反向关联则可以使用belongsTo

image.png

image.png

模型关联一对多
我们可以从admin_role模型中关联admin模型,一种身份或有多个人所以这可以使一对多的关系

image.png

image.png

定义相对关联

image.png

模型关联多对多
多对多关联更为复杂。
中间表:php artisan make:model Models/GradeStudent -m

image.png

课程表:php artisan  make:migration create_grade

php artisan make:model Models/Grade -m

image.png

学生表:php artisan  make:migration create_student

  php artisan make:model Models/Student -m
image.pngbelongsToMany('关联模型','中间表','外键','关联键');
关联模型(必须):模型名或者模型类名
中间表:默认规则是当前模型名+_+关联模型名 (可以指定模型名)
外键  :中间表的当前模型外键,默认的外键名规则是关联模型名+_id
关联键:中间表的关联模型关联键名,默认规则是关联模型名+_id
在student模型中:
通过中间表 gradestatus找到关联表grade
Public function grade(){
1.要关联的表 2,中间表3 当前模型在中间表外键 4,要关联的模型在中间表的外键
Return$this->belongstomany(‘grade::class’,’grade_students’,’student_id’ ,’grade_id’);

} 定义关联关系:注意这里我们直接使用了中间表的方式

image.png

image.png


监听sql
在Providers中的AppservcePeovider.php中
Public function register(){
Sehema::defaultstringLength(191);
DB::listen(function($query){
Echo $query->sql.’
’;
})
}

相关文章更多 >

© 2024版权所有 水水网

电话:171780793