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 在查询之前更改模型表的主要内容,如果未能解决你的问题,请参考以下文章