php - 根据 Eloquent 模型中的值使用 2 个不同的列
问题描述
这里有一个奇怪的场景,我会尽力解释它,我基本上合并了 2 个非常相似但使用不同列名的独立系统。
因此,tablea有一个 tableb,但是tableb是使用 columnid_1
或选择的id_2
。
直接使用模型时,此检查在本地范围内完成:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Tableb extends Model
{
protected $table = 'tableb';
public function scopeMode(Builder $query, $id)
{
if (env('DEMO_MODE')) {
return $query->where('id1', '=', $id);
}
return $query->where('id2', '=', $id);
}
}
因此,按以下方式使用上述模型可以正常工作:
Tablea::mode()->first();
但是,在关系中使用它会有问题,因为相关的列名可能会改变,所以我必须在这个关系中执行相同的逻辑,但我想在一个地方(tableb)执行所有这些逻辑以避免在其他关系:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tablea extends Model
{
public function Tableb()
{
if (env('DEMO_MODE')) {
return $this->hasOne(Tableb::class, 'id2', 'tableb_id');
}
return $this->hasOne(Tableb::class, 'id1', 'tableb_id');
}
}
想法?
解决方案
一个建议是在tableb
返回应该使用哪个 id的 上创建一个静态函数tablea
,如下所示:
(注意:我还没有测试过代码)
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Tableb extends Model
{
protected $table = 'tableb';
public function scopeMode(Builder $query, $id)
{
return $query->where(self::getId(), '=', $id);
}
public static function getId()
{
return env('DEMO_MODE') ? 'id2' : 'id1';
}
}
接着
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tablea extends Model
{
public function Tableb()
{
return $this->hasOne(Tableb::class, Tableb::getId(), 'tableb_id');
}
}
推荐阅读
- r - 在ggplot2中将文本添加到图例颜色方块
- node.js - 无法在nodejs中获取查询参数
- css - 无法使表单在移动设备上响应
- unity3d - 为什么我不能在 Unity 实体中使用字符串作为 IComponentData 的字段?
- elasticsearch - 如何在 ElasticSearch 中按时间获取不同的值?
- datastage - 如何从数据阶段中的序列循环作业调用并行数据加载作业
- c - 使用递归删除一个给定数字的倍数的节点[C编程]
- python - 在JES中将int转换为二进制?
- android - Android Activity 堆栈操作
- python - 从 Django 的 *.po/mo 文件中获取翻译的正确方法是什么?