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

laravel跨库多态关联实战

陈杰5个月前 (11-09)PHP377

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

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:...

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的Observer观察者模式模型事件实战

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

php对接七牛云短信验证码实战

短信验证码登录的用处非常的大,登录,注册,修改密码,安全相关的啥都可以干。选定的七牛云短信是因为存储也是用的七牛云,七牛的sdk都加载进来了,也懒得去换其他的厂家了。下面上代码:Controller层...

laravel集成极光推送实战

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

通过代码创建多个同样的mysql表

在分库分表中可能要同时创建多个结构相同但后缀不同的表,通过代码实现for ($i = 3; $i <= 20; $i++) {    DB::connection('...

发表评论

访客

看不清,换一张

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