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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
php5.3 废弃函数小结
May 16 PHP
深入php常用函数的使用汇总
Jun 08 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
php经典算法集锦
Nov 14 PHP
php生成与读取excel文件
Oct 14 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
PHP实现时间日期友好显示实现代码
Sep 08 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 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实例分享之html转为rtf格式
2014/06/02 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
node.js的事件机制
2017/02/08 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python里运用私有属性和方法总结
2019/07/08 Python
如何基于python操作json文件获取内容
2019/12/24 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
考博专家推荐信模板
2013/12/02 职场文书
工商管理本科生求职信
2014/07/13 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
食品药品安全责任书
2015/05/11 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Python机器学习之PCA降维算法详解
2021/05/19 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android