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核心代码分析require和include的区别
Jan 02 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
php excel reader读取excel内容存入数据库实现代码
Dec 06 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
Thinkphp 中 distinct 的用法解析
Dec 14 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
总结一些PHP中好用但又容易忽略的小知识
Jun 02 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 PHP
PHP ob缓存以及ob函数原理实例解析
Nov 13 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 程序员的调试技术小结
2009/11/15 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
php中上传文件的的解决方案
2018/09/25 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
如何通过Python实现标签云算法
2019/07/02 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
爱岗敬业演讲稿范文
2014/01/14 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
在Python中如何使用yield
2021/06/07 Python
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
javascript函数式编程基础
2021/09/15 Javascript