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 相关文章推荐
杏林同学录(一)
Oct 09 PHP
php GD绘制24小时柱状图
Jun 28 PHP
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
php的mssql数据库连接类实例
Nov 28 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
使用PHPExcel操作Excel用法实例分析
Mar 26 PHP
PHP5.3以上版本安装ZendOptimizer扩展
Mar 27 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 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/09/30 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
python基于socket实现网络广播的方法
2015/04/29 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
超强台风观后感
2015/06/09 职场文书
Python列表的索引与切片
2022/04/07 Python