laravel设置ORM关联关系(分表相关)

17 篇文章 0 订阅

注意适用场景:仅需要获取到某个记录对应的数据,不适用于需要进行with内部进行where判断的场景,其他分表场景建议使用数据库中间件处理

最下面有使用普通table做连表的写法(能用,但是比较丑)

示例:tests与records表1对多关系

1:records模型如下

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Record extends Model
{
    protected $suffix = null;

    /**
     * @param $suffix
     * 设置对象表名
     */
    public function setSuffix($suffix)
    {
        $this->suffix = $suffix;
        if ($suffix !== null) {
            $this->table = 'records_' . $suffix;
        }
    }

    /**
     * @return string
     * 获取对象表名
     */
    public function getTable(){
        return $this->table;
    }

    /**
     * @param $suffix
     * @return mixed
     * 设置表
     */
    public static function suffix($suffix)
    {
        $instance = new static;
        $instance->setSuffix($suffix);

        return $instance->newQuery();
    }

    /**
     * @param array $attributes
     * @param bool $exists
     * @return static
     * 自定义模型并返回
     */
    public function newInstance($attributes = [], $exists = false)
    {
        $model = parent::newInstance($attributes, $exists);
        $model->setSuffix($this->suffix);

        return $model;
    }

    /**
     * @param $testId
     * @return mixed
     * 通过外键获取关联数据
     */
    public static function lists ($testId)
    {
        $suffix = $testId;
        /*
        * 例如 $sufiix = 1; 我要要获取的就是:records_1的模型实例
        */
        return self::suffix($suffix)->where('test_id', $testId)->get();
    }
}

2:test模型如下

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Test extends Model
{
    //指定表名
    protected $table = 'tests';

    //指定主键
    protected $primaryKey = 'id';

    //时间戳自动维护
    // public $timestamps = true;

    //指定允许批批量赋值字段
    protected $fillable = ['name'];

    /**
     * @return HasMany
     * 手动设置一对多关系
     */
    public function records ()
    {
        $instance = new Record();
        $instance->setSuffix($this->id);

        $foreignKey = $instance->getTable() . '.' . $this->getForeignKey();
        $localKey = $this->getKeyName();

        return new HasMany($instance->newQuery(), $this, $foreignKey, $localKey);
    }
}

3:数据获取方式如下(两种方式都可以获取到关联的数据)

Route::post('relate', function(\App\Test $test){
    // return \App\Record::lists(2);
    return \App\Test::find(1)->records;
});

4:普通连表写法

DB::table('tests')
        ->select('tests.*','t.id as tid','t.name as tname')
        ->join(
            DB::raw('( (SELECT records_1.* FROM records_1) UNION (SELECT records_2.* FROM records_2) UNION (SELECT records_3.* FROM records_3) UNION (SELECT records_4.* FROM records_4) ) as t'),
            function($join){
                $join->on('tests.id', '=', 't.test_id');
            }
        )->get();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值