当前位置:首页 > PHP > 正文内容

laravel跨库多态关联实战

陈杰2年前 (2020-11-09)PHP2182

点赞记录表做了分库分表,位于副库里面

image.png


表结构

image.png


该点赞表关联了8个不同的表,因为业务原因,评论回复表有四个板块,所以做了4个评论记录表,4个回复记录表,且结构有细微不同。


目标是用户获得被点赞记录,根据不同的type值关联到不同的评论或者回复。


上代码。。。。。


<?php

namespace App\Model\Member;

use App\Model\BaseModel;
use App\Model\Circle\CircleCommentModel;
use App\Model\Circle\CircleCommentSubModel;
use App\Model\Group\GroupCommentModel;
use App\Model\Group\GroupCommentSubModel;
use App\Model\Interview\InterviewCommentModel;
use App\Model\Interview\InterviewCommentSubModel;
use App\Model\Library\LibraryCommentModel;
use App\Model\Library\LibraryCommentSubModel;

class MemberLikeModel extends BaseModel
{
   public $connection = "mysql_logs";
   public $timestamps = false;
   public $table = "member_like";


   public function getCommentTypeAttribute($val)
   {
       $map = [
           1 => LibraryCommentModel::class,
           2 => LibraryCommentSubModel::class,
           3 => InterviewCommentModel::class,
           4 => InterviewCommentSubModel::class,
           5 => CircleCommentModel::class,
           6 => CircleCommentSubModel::class,
           7 => GroupCommentModel::class,
           8 => GroupCommentSubModel::class
       ];

       $data = $map[$this->type] ?? LibraryCommentModel::class;
       return $this->attributes['comment_type'] = $data;
   }

   public function content()
   {
       return $this->morphTo('content', 'comment_type', 'pid');
   }

   public function member()
   {
       return $this->hasOne(MemberModel::class, 'id', 'member_id');
   }
}


public $connection = "mysql_logs";指定了该member_like表到副库,并且从baseModel继承了两个分表取模方法。

// 设置表后缀
public function setSuffix(int $suffix, int $mold)
{
   if ($suffix > 0) {
       $suffix      = intval($suffix % $mold) + 1;
       $this->table = $this->getTable() . '_' . $suffix;
   }
}

// 提供一个静态方法设置表后缀
public static function suffix(int $suffix = 0, int $mold = 20)
{
   $instance = new static;
   $instance->setSuffix($suffix, $mold);

   return $instance->newQuery();
}


还设置了一个获取器,

getCommentTypeAttribute

因为之前的逻辑只存放了type为int值。但是多态关联需要使用到模型名称,所以通过一个获取器给模型追加一个comment_type字段并计算到相应的模型名。


被关联到评论表以其中一个举例


public $connection = 'mysql';

public function content()
{
   return $this->morphOne(MemberLikeModel::class, 'content', 'comment_type', 'pid', 'id');
}


最终实现了跨表跨库多态关联


上使用方法


public function history_like(int $member_id, int $count)
{
   $data = MemberLikeModel::suffix($member_id, 20)->with(['content',self::$With_Member])
       ->where('return_id', $member_id)
       ->orderByDesc('id')
       ->paginate($count);
   return $data;
}


扫描二维码至手机访问

扫描二维码推送至手机访问。

版权声明:本文由何烦过虎溪发布,如需转载请注明出处。

转载请注明出处:http://95shouyou.com/?id=11

分享给朋友:

相关文章

laravel实现微信公众号授权登录实战

微信公众号授权登录实战框架:laravel依赖:overtrue/wechat首先安装一下easywechat依赖composer require overtrue/wechat:...

laravel的Observer观察者模式模型事件实战

laravel的orm特别好用,特别是observer观察者模式,可以在不更改原有业务代码的情况下做到切入编程,有点类似于我们之前常用的钩子函数。下面就是我们深入observer观察者模式的实战代码现...

laravel通过模板html生成word文档

laravel通过模板html生成word文档

因为公司项目需要,内部的管理系统有一个php实时查询数据库,根据内容来生成word文档排版没有什么需求,实现原理是查询数据库,然后用laravel自带的模板引擎,生成一个html网页,然后修改网页的r...

Laravel带条件查询多个count

Laravel带条件查询多个count

在一个数据表中,我们需要用到聚合函数count来查询符合条件的总数。举例一个场景:我们有一个帖子,这个帖子可以分别被好中差评,好中差评记录用一个单独的记录表来存储。如果用户点击好评,那么该帖子作者的经...

laravel集成极光推送实战

公司项目需要用到app推送消息通知,市面上很多推送渠道商,选来选去最终选定了极光推送,因为项目使用laravel写的,laravel自身又有模型事件,所以研究了一下,在不改动原有代码的情况下,给项目加...

Laravel记录SQL操作日志的方法

Laravel记录SQL操作日志的方法

在laravel中我们有一个需求就是,涉及到sql操作的update,insert,delete操作的语句,我们都要写一个日志来记录一下说说方法吧。在项目目录app/Providers/AppServ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。