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 相关文章推荐
PHP动态创建Web站点的方法
Aug 14 PHP
PHP中函数rand和mt_rand的区别比较
Dec 26 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
解析link_mysql的php版
Jun 30 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
重新认识php array_merge函数
Aug 31 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
php恢复数组的key为数字序列的方法
Apr 28 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 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
简单易用的计数器(数据库)
2006/10/09 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
jquery提示 &quot;object expected&quot;的解决方法
2009/12/13 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
Javascript中神奇的this
2016/01/20 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
Django在win10下的安装并创建工程
2017/11/20 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
教育专业个人求职信
2013/12/02 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
党支部承诺书
2015/01/20 职场文书
实习单位鉴定意见
2015/06/04 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
python字典进行运算原理及实例分享
2021/08/02 Python