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

laravel跨库多态关联实战

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

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

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

分享给朋友:

相关文章

Lumen框架报错Cannot declare class Event, because the name is already in use

Lumen框架报错Cannot declare class Event, because the name is already in use

Lumen框架报错信息Cannot declare class Event, because the name is already in use(1/1) ErrorExceptionCa...

Laravel记录SQL操作日志的方法

Laravel记录SQL操作日志的方法

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

利用workerman实现webrtc实时音视频通话

利用workerman实现webrtc实时音视频通话

实现原理利用workerman的websocket实现实时消息传递。webrtc自带p2p功能,利用STUN中继服务器实现webrtc实时音视频看看我们的前端文件,只是一个单页面<html>...

Lumen框架报错Class session does not exist

Lumen框架报错Class session does not exist

由于lumen框架是为速度而生的 Laravel 框架,所以移除了session的支持,虽然在ide中代码提示可以敲出Session::put()方法出来,但是最终还是提示的是Class sessio...

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

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

Laravel带条件查询多个count

Laravel带条件查询多个count

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

发表评论

访客

看不清,换一张

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