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+DBM的同学录程序(3)
Oct 09 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
PHP array_multisort() 函数的深入解析
Jun 20 PHP
php防注入及开发安全详细解析
Aug 09 PHP
php中filter_input函数用法分析
Nov 15 PHP
php运行时动态创建函数的方法
Mar 16 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
Apr 26 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
小型js框架veryide.librar源代码
2009/03/05 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
浅谈Python的垃圾回收机制
2016/12/17 Python
Python实现定时任务
2017/02/08 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
linux系统都有哪些运行级别
2012/04/15 面试题
行政经理岗位职责
2013/11/09 职场文书
计算机相关的自我评价
2014/01/15 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
售后服务承诺书
2014/03/26 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server