PHP框架Eloquent对比:Laravel与Yii2语法差异

一个用户可能有多个文章,一个文章是某个用户书写的,这就是关系。同样文章中可能包含多个 tag,而一个 tag 可能关联多个文章。

在项目中,我们已经有了 User.php,也就是用户模型,查看一下,相当简单。我们希望直接使用 $user->articles() 的形式获取全部文章,让我们修改 user 模型:

  public function articles() {
    return $this->hasMany('AppArticle');
  }

但是我们仅仅完成了关系中的一端,让我们来处理另一端。我们希望的形式是 $article->user() ,让我们修改 article 模型。

  public function user() {
    return $this->belongsTo('AppUser');
  }

在我们的数据库中,文章模型没有用户的外键,我们需要设置,修改 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免费学习笔记(深入)”;

1

2

3

4

5

6

7

8

9

10

11

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 AppUser;
=&gt; <app> {}
&gt;&gt;&gt; $user-&gt;name = 'zhang jinglin';
=&gt; "zhang jinglin"
&gt;&gt;&gt; $user-&gt;email = 'zjl@example.com';
=&gt; "zjl@example.com"
&gt;&gt;&gt; $user-&gt;password = bcrypt('pass');
=&gt; "$2y$10$Nbl2b9wqd.rXqKEsd3pRSOoIyFAFIhbqf71BufwDfS3Guv21SlEx2"
&gt;&gt;&gt; $user-&gt;save();
=&gt; true
&gt;&gt;&gt; AppUser::first()-&gt;toArray();
=&gt; [
    "id"     =&gt; "1",
    "name"    =&gt; "zhang jinglin",
    "email"   =&gt; "zjl@example.com",
    "created_at" =&gt; "2015-03-31 03:24:55",
    "updated_at" =&gt; "2015-03-31 03:24:55"
  ]
&gt;&gt;&gt; 

</app>

现在我们需要新发布的文章和用户关联,我们暂时先修改 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
&gt;&gt;&gt; AppArticle::first()-&gt;toArray();
=&gt; [
    "id"      =&gt; "1",
    "user_id"   =&gt; "1",
    "title"    =&gt; "User 1 Article",
    "body"     =&gt; "User 1 Body",
    "published_at" =&gt; "2015-03-31 08:00:00",
    "created_at"  =&gt; "2015-03-31 04:17:58",
    "updated_at"  =&gt; "2015-03-31 04:17:58",
    "excerpt"   =&gt; null
  ]

#获取用户
&gt;&gt;&gt; $user = AppUser::first();
=&gt; <app> {
    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"
  }

#获取用户文章
&gt;&gt;&gt; $user-&gt;articles()-&gt;toArray();
BadMethodCallException with message 'Call to undefined method IlluminateDatabaseQueryBuilder::toArray()'
&gt;&gt;&gt; $user-&gt;articles-&gt;toArray();
=&gt; [
    [
      "id"      =&gt; "1",
      "user_id"   =&gt; "1",
      "title"    =&gt; "User 1 Article",
      "body"     =&gt; "User 1 Body",
      "published_at" =&gt; "2015-03-31 08:00:00",
      "created_at"  =&gt; "2015-03-31 04:17:58",
      "updated_at"  =&gt; "2015-03-31 04:17:58",
      "excerpt"   =&gt; null
    ]
  ]
  
#为什么使用 $user-&gt;articles 而不是 #user-&gt;articles()?
#事实上,$user-&gt;articles()返回的是关系,如果你想用 articles() 你需要这样用
&gt;&gt;&gt; $user-&gt;articles()-&gt;get()-&gt;toArray();
=&gt; [
    [
      "id"      =&gt; "1",
      "user_id"   =&gt; "1",
      "title"    =&gt; "User 1 Article",
      "body"     =&gt; "User 1 Body",
      "published_at" =&gt; "2015-03-31 08:00:00",
      "created_at"  =&gt; "2015-03-31 04:17:58",
      "updated_at"  =&gt; "2015-03-31 04:17:58",
      "excerpt"   =&gt; null
    ]
  ]
  
#你只能使用 articles() 来进行下一步的工作,比如下面的查询

$user-&gt;articles()-&gt;where('title', 'User 1 Article')-&gt;get();

#我们也可以通过 article 获取 user

&gt;&gt;&gt; $article = AppArticle::first();
=&gt; <app> {
    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
  }
&gt;&gt;&gt; $article-&gt;user;
=&gt; <app> {
    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"
  }
&gt;&gt;&gt; 
</app></app></app>

以上所述就是本文的全部内容了,希望大家能够喜欢。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空