资讯专栏INFORMATION COLUMN

Laravel 多态关联(morphTo,morphMany)

lyning / 3711人阅读

摘要:多态关联在网站开发的过程中经常会遇到评论商品,评论文章评论店铺等等在处理这样的需求的时候经常会新建一张评论表然后通过一个字段来区分评论的对象开发过程如下新建表操作表字段评论对象评论对象的评论内容做数据迁移造数据用户为和的用户

Laravel 多态关联(morphTo,morphMany)
在网站开发的过程中,经常会遇到 评论商品,评论文章, 评论店铺 等等,在处理这样的需求的时候, 经常会新建一张 评论表, 然后通过 一个 type字段来区分 评论的对象 开发过程如下:

新建表操作

</>复制代码

  1. php artisan make:model Models/Comments -m

表字段:

</>复制代码

  1. public function up()
  2. {
  3. Schema::create("comments", function (Blueprint $table) {
  4. $table->increments("id");
  5. $table->timestamps();
  6. $table->integer("member_id");
  7. $table->string("comment_object_type"); # 评论对象
  8. $table->integer("comment_object_id"); # 评论对象的id
  9. $table->text("comment_content"); # 评论内容
  10. $table->tinyInteger("status");
  11. });
  12. }

做数据迁移:

</>复制代码

  1. php artisan migrate

造数据
用户 ID 为2和4 的用户对 商品ID 为 1,2,3,4的商品进行评论:

</>复制代码

  1. INSERT INTO `comments`(`member_id`,`comment_object_type`,`comment_object_id`,`status`,`created_at`,`updated_at`)
  2. VALUES
  3. (2,"AppModelsGoods",1,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),
  4. (2,"AppModelsGoods",2,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),
  5. (2,"AppModelsGoods",3,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),
  6. (2,"AppModelsGoods",4,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),
  7. (4,"AppModelsGoods",3,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),
  8. (3,"AppModelsGoods",4,0,"2018-09-07 15:58:04","2018-09-07 15:58:04")

2.用户ID 为2 的用户 对 店铺ID 为 1,4 的 店铺进行了评论

</>复制代码

  1. INSERT INTO `comments`(`member_id`,`comment_object_type`,`comment_object_id`,`status`,`created_at`,`updated_at`)
  2. VALUES
  3. (2,"AppModelsStores",1,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),
  4. (2,"AppModelsStores",4,0,"2018-09-07 15:58:04","2018-09-07 15:58:04"),

查询
数据造完毕, 接下来要做查询,查询一下 商品id为2的 所有评论, 并且查询出评论人的信息
普通查询:

</>复制代码

  1. public function comment_list(Requset $request, Goods $goods)
  2. {
  3. # 查询商品的所有评论
  4. $comments = Comment::where("comment_object_type",Goods::class)->where("comment_object_id",$goods->id)->get();
  5. if($comments) {
  6. foreach($comments as $comment) {
  7. $comment->member = Member::find("id",$comment->member_id)
  8. }
  9. }
  10. dd($comments)
  11. }

普通连表查

</>复制代码

  1. Comment.php 文件

</>复制代码

  1. # Comment model 文件修改
  2. # 查找评论的用户的信息
  3. public function member()
  4. {
  5. return $this->belongsTo(Member::class, "comment_member_id");
  6. }

需求的查询

</>复制代码

  1. public function comment_list(Requset $request, Goods $goods)
  2. {
  3. # 查询商品的所有评论
  4. $comments = Comment::where("comment_object_type",Goods::class)->where("comment_object_id",$goods->id)->get();
  5. # 省掉了 循环 在模板遍历的时候 直接调用 $item->member 查看用户信息
  6. dd($comments)
  7. }

多态查询

</>复制代码

  1. Comment.php 文件

</>复制代码

  1. # Comment model 文件修改
  2. # 评论对象
  3. public function comment_object()
  4. {
  5. return $this->morphTo();
  6. }
  7. # 查找评论的用户的信息
  8. public function member()
  9. {
  10. return $this->belongsTo(Member::class, "comment_member_id");
  11. }

</>复制代码

  1. Goods.php 文件

</>复制代码

  1. # 商品关联评论
  2. public function comments()
  3. {
  4. return $this->morphMany(Comment::class,self::class,"comment_object_type","comment_object_id");
  5. }

需求的查询

</>复制代码

  1. public function comment_list(Requset $request, Goods $goods)
  2. {
  3. # 查询商品的所有评论
  4. $comments =$goods->comments()->with("member")->paginate(15);
  5. dd($comments)
  6. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31067.html

相关文章

  • Laravel Eloquent 模型关联速查表

    摘要:模型資料庫遷移儲存紀錄在及之間建立關聯在及之間建立關聯取得紀錄取得取得一对多关联示例细节在此示例中,我们有两个模型小偷和车,和两张表和。业务规则小偷可以偷走多辆车。关系图关联详情关联表应该保存驾驶员和汽车。 showImg(https://segmentfault.com/img/remote/1460000016043938); 一張 Laravel’s Eloquent ORM 5...

    flybywind 评论0 收藏0
  • 一个 16年毕业生所经历的 PHP 面试

    摘要:正确做法是给加索引,还有联合索引,并不能避免全表扫描。 前言:有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 有心的同学应该会看到我这个noteBook下面的其它知识,希望对你们有些许帮助。 本文地址 时间点:2017-11 一个16年毕业生所经历的php面试 一、什么是面试 二、面试准备 1. 问:什么时候开始准备? 2. 问:怎么准备? 三、面试...

    dabai 评论0 收藏0
  • Laravel核心解读--Database(四) 模型关联

    摘要:为关联关系设置约束子模型的等于父模型的上面设置的字段的值子类实现这个抽象方法通过上面代码看到创建实例时主要是做了一些配置相关的操作,设置了子模型父模型两个模型的关联字段和关联的约束。不过当查询父模型时,可以预加载关联数据。 Database 模型关联 上篇文章我们主要讲了Eloquent Model关于基础的CRUD方法的实现,Eloquent Model中除了基础的CRUD外还有一个...

    gekylin 评论0 收藏0
  • Laravel Model 利用 Macroable 为数据模型添加宏能力

    摘要:利用当前类没有这个函数的时候执行这个函数名注册的回调。使用有了这个那么我们添加到模型中,就可以使用宏能力为其动态添加函数了这样,我们可以直接拿到用户发布的所有问题了。 【摘要】简单的说一下宏能力,这个类是 IlluminateSupportTraitsMacroable 其中利用重载实现了可以定义宏的功能,即通过 macro 静态方法添加回调,并定义一个名字。利用 __call 当前类...

    zhangfaliang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<