Laravel 5框架学习之Eloquent 关系


Posted in PHP onApril 09, 2015

一个用户可能有多个文章,一个文章是某个用户书写的,这就是关系。同样文章中可能包含多个 TAG,而一个 TAG 可能关联多个文章。

在项目中,我们已经有了 User.php,也就是用户模型,查看一下,相当简单。我们希望直接使用 $user->articles() 的形式获取全部文章,让我们修改 user 模型:

public function articles() {
    return $this->hasMany('App\Article');
  }

但是我们仅仅完成了关系中的一端,让我们来处理另一端。我们希望的形式是 $article->user() ,让我们修改 article 模型。

public function user() {
    return $this->belongsTo('App\User');
  }

在我们的数据库中,文章模型没有用户的外键,我们需要设置,修改 create_article_table.php

Schema::create('articles', function(Blueprint $table)
 {
  $table->increments('id');
      //指定外键列
      $table->integer('user_id')->unsigned();
      $table->string('title');
      $table->text('body');
      $table->timestamp('published_at');
  $table->timestamps();

      //生成外键
      $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
 });

因为我们只是在开发阶段,还没有上线运行,我们可以直接修改数据库迁移文件,回滚然后迁移即可,但是如果上线运行的话,应该新建一个迁移。

php artisan migrate:refresh

#输出信息
Rolled back: 2015_03_28_050138_create_article_table
Rolled back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_000000_create_users_table
Nothing to rollback.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_03_28_050138_create_article_table
Migrated: 2015_03_28_051200_add_excerpt_to_articels_table

现在让我们使用 tinker 来创建一个用户。

php artisan tinker
Psy Shell v0.4.1 (PHP 5.4.16 — cli) by Justin Hileman

#下面是执行过程
>>> $user = new App\User;
=> <App\User #000000007f1ad61a000000006497cc4f> {}
>>> $user->name = 'zhang jinglin';
=> "zhang jinglin"
>>> $user->email = 'zjl@example.com';
=> "zjl@example.com"
>>> $user->password = bcrypt('pass');
=> "$2y$10$Nbl2b9wqd.rXqKEsd3pRSOoIyFAFIhbqf71BufwDfS3Guv21SlEx2"
>>> $user->save();
=> true
>>> App\User::first()->toArray();
=> [
    "id"     => "1",
    "name"    => "zhang jinglin",
    "email"   => "zjl@example.com",
    "created_at" => "2015-03-31 03:24:55",
    "updated_at" => "2015-03-31 03:24:55"
  ]
>>>

现在我们需要新发布的文章和用户关联,我们暂时先修改 form_partial.blade.php 来隐藏一个用户id,只是暂时:

{{--临时处理--}}

{!! Form::hidden('user_id', 1) !!}

同时要修改模型的 $fillabel 属性,以便我们的 Mass Assisment。

protected $fillable = [
    'title',
    'body',
    'published_at',
    'user_id' //临时设置
  ];

OK,添加一个文章。我们使用 tinker 来查看一下。

php artisan tinker
Psy Shell v0.4.1 (PHP 5.4.16 — cli) by Justin Hileman
>>> App\Article::first()->toArray();
=> [
    "id"      => "1",
    "user_id"   => "1",
    "title"    => "User 1 Article",
    "body"     => "User 1 Body",
    "published_at" => "2015-03-31 08:00:00",
    "created_at"  => "2015-03-31 04:17:58",
    "updated_at"  => "2015-03-31 04:17:58",
    "excerpt"   => null
  ]

#获取用户
>>> $user = App\User::first();
=> <App\User #0000000051cbb9d70000000073e11a3e> {
    id: "1",
    name: "zhang jinglin",
    email: "zjl@example.com",
    created_at: "2015-03-31 03:24:55",
    updated_at: "2015-03-31 03:24:55"
  }

#获取用户文章
>>> $user->articles()->toArray();
BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::toArray()'
>>> $user->articles->toArray();
=> [
    [
      "id"      => "1",
      "user_id"   => "1",
      "title"    => "User 1 Article",
      "body"     => "User 1 Body",
      "published_at" => "2015-03-31 08:00:00",
      "created_at"  => "2015-03-31 04:17:58",
      "updated_at"  => "2015-03-31 04:17:58",
      "excerpt"   => null
    ]
  ]
  
#为什么使用 $user->articles 而不是 #user->articles()?
#事实上,$user->articles()返回的是关系,如果你想用 articles() 你需要这样用
>>> $user->articles()->get()->toArray();
=> [
    [
      "id"      => "1",
      "user_id"   => "1",
      "title"    => "User 1 Article",
      "body"     => "User 1 Body",
      "published_at" => "2015-03-31 08:00:00",
      "created_at"  => "2015-03-31 04:17:58",
      "updated_at"  => "2015-03-31 04:17:58",
      "excerpt"   => null
    ]
  ]
  
#你只能使用 articles() 来进行下一步的工作,比如下面的查询

$user->articles()->where('title', 'User 1 Article')->get();

#我们也可以通过 article 获取 user

>>> $article = App\Article::first();
=> <App\Article #0000000051cbb9d60000000073e11a3e> {
    id: "1",
    user_id: "1",
    title: "User 1 Article",
    body: "User 1 Body",
    published_at: "2015-03-31 08:00:00",
    created_at: "2015-03-31 04:17:58",
    updated_at: "2015-03-31 04:17:58",
    excerpt: null
  }
>>> $article->user;
=> <App\User #0000000051cbb92d0000000073e11a3e> {
    id: "1",
    name: "zhang jinglin",
    email: "zjl@example.com",
    created_at: "2015-03-31 03:24:55",
    updated_at: "2015-03-31 03:24:55"
  }
>>>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
Gregarius中文日期格式问题解决办法
Apr 22 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
php字符串截取函数用法分析
Nov 25 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 PHP
简单谈谈favicon
Jun 10 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
PHP简单遍历对象示例
Sep 28 PHP
php实现背景图上添加圆形logo图标的方法
Nov 17 PHP
php json相关函数用法示例
Mar 28 PHP
php实现算术验证码功能
Dec 05 PHP
在html文件中也可以执行php语句的方法
Apr 09 #PHP
PHP统一页面编码避免乱码问题
Apr 09 #PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 #PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 #PHP
php判断文件夹是否存在不存在则创建
Apr 09 #PHP
从wamp到xampp的升级之路
Apr 08 #PHP
Laravel 5框架学习之表单验证
Apr 08 #PHP
You might like
PHP安装攻略:常见问题解答(一)
2006/10/09 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
python drf各类组件的用法和作用
2021/01/12 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
《鹬蚌相争》教学反思
2014/04/22 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
营业员岗位职责范本
2015/04/14 职场文书
民主生活会主持词
2015/07/01 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
详解TypeScript中的类型保护
2021/04/29 Javascript