Laravel 在查询之前更改模型表

Posted

技术标签:

【中文标题】Laravel 在查询之前更改模型表【英文标题】:Laravel change models table right before query 【发布时间】:2020-01-25 17:15:21 【问题描述】:

我需要在查询开始之前从 Laravel 模型中更改查询表。

通常你会这样查询:

ExampleModel::where('column_name', =, 'value')->get();

对于一种情况,我想使用一个视图表,其中包含来自多个表的信息组合在一个视图中。

因此我只需要在这种情况下切换ExampleModel的表,例如:

ExampleModel::table('my_view')->where(...)->get();

使用DB::table('my_view')->where(...)->get() 不是一个选项,因为需要在ExampleModel 上应用多个本地范围。

如我所见,有以下选项:

    以某种方式即时更改模型表名称(如上所示) 创建一个仅在此用例中使用的新模型,其视图定义为模型表 将我所有的作用域写入链式DB-command

还有其他选择吗?

【问题讨论】:

我不明白您为什么需要为此使用相同的模型。我假设您正在谈论的两个模型彼此之间有关系吗?在这种情况下,您可以使用 laravel.com/docs/6.x/eloquent-relationships 。如果我错了,请纠正我。 【参考方案1】:

您可以通过将表名传递给 setTable() 方法来执行此操作,例如:

$user = new Users();
$user->setTable('customers');
$user->where(id,1)
...

【讨论】:

他在查询而不是模型之前询问,setTable() 在您使用查询生成器时将不起作用。【参考方案2】:

处理此问题的 laravel 方法是为您的视图提供一个专用模型,并将 Scopes 应用于每个相关模型:


<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class AgeScope implements Scope

    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    
        $builder->where('age', '>', 200);
    

然后在您的 ExampleModel 和您的 MyView 模型中

 protected static function boot()
    
        parent::boot();

        static::addGlobalScope(new AgeScope);
    

因此,当您想要编辑范围时,它将反映在您的每个查询中

但是

您将始终知道您的模型是来自您的 view_table 还是来自您的 example_model 表。

如果您需要让两者都使用一些访问器或函数,我建议您将它们放在一个 Trait 中并在两个模型上使用它们

trait ExampleModelTrait

   getTestAttribute()
      return strtolower($this->column_name);
   

然后

use ExampleModelTrait;

【讨论】:

以上是关于Laravel 在查询之前更改模型表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询构建器和表名

laravel 基础教程 —— Eloquent

如何在 laravel 4.2 中动态更改模型表?

如何更改 laravel 中的用户模型以使用其他表进行身份验证而不是用户?

laravel 关联查询 表一、表二、两个表的关联表

3分钟短文:Laravel 模型查询数据库的几个关键方法