如何在laravel中使用join自动过滤外来表的deleted_at = null?[副本]

c3frrgcw  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(240)

此问题已在此处有答案

get null column after join tables on this coulmn laravel(2个答案)
昨天关门了。
就像现在一样->join()是一个查询生成器,所以它不会使用具有SoftDelete的Model,在我的项目中有太多使用join的代码,所以我不想手动将其全部替换为急切加载->with(),有人知道如何在保持join的同时做到这一点吗?
例如,我想得到这样的数据,而不需要在所有代码中添加->where('tb_b.deleted_at',null):

$data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')->get()
qyswt5oh

qyswt5oh1#

基本上有两种方法可以解决这个问题
1.通过使用whereNull约束

$data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
    ->whereNull('tb_b.deleted_at')
    ->get();

1.在你的模型中创建一个全局作用域(这里,我假设是TbB模型)。在模型类中添加以下函数,以创建一个全局范围,从而自动过滤模型的get方法。

public static function boot()
{
    parent::boot();

    static::addGlobalScope('notDeleted', function (Builder $builder) {
        $builder->where('deleted_at', null);
    });
}

然后,你会这样做,当你需要你的数据没有被删除的数据

$data = TabelA::withoutGlobalScope('notDeleted')
    ->join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
    ->get();

在这里阅读更多关于Laravel scope的内容:https://learn2torials.com/a/laravel8-global-model-scope

yhxst69z

yhxst69z2#

三种选择
1.在连接后添加WHERE子句

TabelA::query()
    ->join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
    ->whereNull('tb_b.deleted_at')
    ->get()

1.向联接添加AND子句

TabelA::query()
    ->join(function ($join) {
        $join->on('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
            ->whereNull('tb_b.deleted_at');
    })
    ->get()

1.连接子查询。

TabelA::query()
    ->joinSub(
        function ($sub) {
            $sub->from('tb_b')
                ->whereNull('tb_b.deleted_at');
        }),
        'tb_b_alias',
        'tb_b_alias.id_b',
        '=',
        'tb_a.id_b'
    )
    ->get()

相关问题