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生成静态页面详解
Dec 05 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
让你成为更出色的PHP开发者的10个技巧
Feb 25 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
php curl批处理实现可控并发异步操作示例
May 09 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
Swoole扩展的6种模式深入详解
Mar 04 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
目录,文件操作详谈―PHP
2006/11/25 PHP
PHP中for循环语句的几种变型
2007/03/16 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
php桥接模式应用案例分析
2019/10/23 PHP
js select常用操作控制代码
2010/03/16 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
javascript操作cookie
2017/01/17 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
python局域网ip扫描示例分享
2014/04/03 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python os.access()用法实例
2019/02/18 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
旺仔牛奶广告词
2014/03/20 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
服务口号大全
2014/06/11 职场文书
2014年督导工作总结
2014/11/19 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
Nginx配置根据url参数重定向
2022/04/11 Servers