【发布时间】:2021-11-15 07:14:34
【问题描述】:
我有一个模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MultiProductVariantPivot extends Model
{
//use HasFactory;
protected $table = "multi_product_variant_pivot";
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'multi_product_id',
'variant_id',
'decision_tree',
'hashed_decision_tree'
];
}
我有一个问题:
$variant_decision_trees = MultiProductVariantPivot::where('multi_product_id', $multi_product_id)->get();
我有一个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'products.multi_product_variant_pivot' in 'where clause' (SQL: select * from `products` where `products`.`multi_product_variant_pivot` = 1 and `products`.`multi_product_variant_pivot` is not null)
问题:有人可以向我解释为什么 Laravel 指向的是“产品”表(我有一个真实的表)而不是明确定义的表吗?我如何阻止 Laravel 不受惩罚地凌驾于我的决定之上?是否有我应该运行的终端更新命令来刷新 something?
编辑:
我发现了另一个有趣的事情,如果我将where() 中的列名更改为“multi_product_id_test”而不是“multi_product_id”,它将引用正确的表..
给出的新错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'multi_product_id_test' in 'where clause' (SQL: select * from `multi_product_variant_pivot` where `multi_product_id_test` = 1)
因此,where() 中的列选择影响了表选择。有人愿意解释如何避免这种情况吗?此外,它似乎在第一个查询中添加了一个额外的“不为空”子句,这显然是发生了一些奇怪的事情。
编辑 2:
如果我将表名更改为 mproduct_variant 之类的错误名称,它会使用正确的查询,如果我将其更改为匹配现有表,它会执行错误的查询。Laravel 正在尽最大努力让我无法工作,我印象深刻。
编辑 3: 如果我将模型中的表名更改为:
protected $table = "multi_product_variant";
我得到的错误是:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'products.multi_product_variant_pivot' in 'where clause' (SQL: select * from `products` where `products`.`multi_product_variant_pivot` = 1 and `products`.`multi_product_variant_pivot` is not null)
可以看出它使用products.multi_product_variant_pivot 而不是multi_product_variant。有人可以解释这种行为吗?它似乎在缓存我的旧表名?很奇怪。
【问题讨论】: