当前位置 > it书童 > laravel > 正文

laravel6模型

laravel it书童 2020-02-08 09:57:23 0赞 0踩 254阅读 0评论

目录规范

将模型文件统一放到 app/Models

需要将默认生成的 app/User.php 移至 app/Models/User.php

修改该类的命名空间

namespace App\Models;

编辑器全局搜索 App\User 替换为 App\Models\User

数据迁移

生成与回滚

$ php artisan migrate
$ php artisan migrate:rollback

新增字段

$ php artisan make:migration add_avatar_and_introduction_to_users_table --table=users

创建模型

$ php artisan make:model Models/Category -m

每当我们创建完数据模型后,都需要设置 Category 的 $fillable 白名单属性,告诉程序那些字段是支持修改的

初始化数据

面对数据库内容填充的需求,一般情况下我们会使用 Laravel 的 『数据填充 Seed』 。可是在当下场景中,我们无法使用此功能。此一般是用来生成假数据,而现在我们需要生成的是项目的 初始化数据,这些数据是项目运行的一部分,在生产环境下也会使用到,而数据填充只能在开发时使用。

虽然 Laravel 没有自带此类解决方案,不过数据迁移功能倒是比较不错的替代方案。在功能定位上,数据迁移也是项目的一部分,执行的时机刚好是在项目安装时。并且区分执行先后顺序,这确保了初始化数据发生在数据表结构创建完成后

$ php artisan make:migration seed_categories_data
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class SeedCategoriesData extends Migration
{
    public function up()
    {
        $categories = [
            [
                'name'        => '分享',
                'description' => '分享创造,分享发现',
            ],
            [
                'name'        => '教程',
                'description' => '开发技巧、推荐扩展包等',
            ],
            [
                'name'        => '问答',
                'description' => '请保持友善,互帮互助',
            ],
            [
                'name'        => '公告',
                'description' => '站点公告',
            ],
        ];

        DB::table('categories')->insert($categories);
    }

    public function down()
    {
        DB::table('categories')->truncate();
    }
}

模型关联

一对一

public function user()
{
	return $this->belongsTo(User::class);
}

一对多

public function topics()
{
	return $this->hasMany(Topic::class);
}

属性

$fillable 属性的作用是防止用户随意修改模型数据,只有在此属性里定义的字段,才允许修改,否则更新时会被忽略

本地作用域

以排序功能为例:

视图层传递排序

<ul class="nav nav-pills">
	<li class="nav-item">
		<a class="nav-link {{ active_class( ! if_query('order', 'recent')) }}" href="{{ Request::url() }}?order=default">
			最后回复
		</a>
	</li>
	<li class="nav-item">
		<a class="nav-link {{ active_class(if_query('order', 'recent')) }}" href="{{ Request::url() }}?order=recent">
			最新发布
		</a>
	</li>
</ul>

模型层定义排序

public function scopeWithOrder($query, $order)
{
	// 不同的排序,使用不同的数据读取逻辑
	switch ($order) {
		case 'recent':
			$query->recent();
			break;

		default:
			$query->recentReplied();
			break;
	}
}

public function scopeRecentReplied($query)
{
	// 当话题有新回复时,我们将编写逻辑来更新话题模型的 reply_count 属性,
	// 此时会自动触发框架对数据模型 updated_at 时间戳的更新
	return $query->orderBy('updated_at', 'desc');
}

public function scopeRecent($query)
{
	// 按照创建时间排序
	return $query->orderBy('created_at', 'desc');
}

控制器中调用

public function index(Request $request, Topic $topic)
{   
	$topics = $topic->withOrder($request->order)
					->with('user', 'category')  // 预加载防止 N+1 问题
					->paginate(20);
	return view('topics.index', compact('topics'));
}

观察器

以话题自动生成摘要为例

生成观察器

$ php artisan make:observer TopicObserver --model=Topic

关联对应的模型

<?php

namespace App\Observers;

use App\Models\Topic;

// creating, created, updating, updated, saving,
// saved,  deleting, deleted, restoring, restored

class TopicObserver
{
    public function saving(Topic $topic)
    {
        $topic->excerpt = make_excerpt($topic->body);
    }

    public function creating(Topic $topic)
    {
        //
    }

    public function updating(Topic $topic)
    {
        //
    }
}

注册观察器

app/Providers/AppServiceProvider.php

public function boot()
{
   \App\Models\Topic::observe(\App\Observers\TopicObserver::class);
}
转载须注明出处:https://www.itshutong.com/articles/405/laravel6-model
标签: laravel6
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
发表评论
我有句话,不知当讲不当讲?
要讲之前请先 登录