【问题标题】:Laravel assumes wrong table name in model when it is hard codedLaravel 在硬编码时假定模型中的表名错误
【发布时间】: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。有人可以解释这种行为吗?它似乎在缓存我的旧表名?很奇怪。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    那是因为您使用“Pivot”后缀命名模型,这会干扰 Laravel 的多对多关系系统,而不是最佳实践。你可以做的是通过告诉 Laravel 使用哪个表来“强制”它:

    $variant_decision_trees = MultiProductVariantPivot
    ::where(`multi_product_variant_pivot.multi_product_id`, $multi_product_id)->get();
    

    这是我能想到的可能性,可能不是根源。为了上帝的爱。如果可以,请遵守约定。

    【讨论】:

    • 我检查了它似乎不是由于枢轴后缀,它仅在表不存在时进行正确查询,如果multi_product_variant_pivot 确实存在,它将表切换到“产品” ..我什至尝试将其重命名为mproduct_variant,但仍然存在同样的问题。
    【解决方案2】:

    好的,就是这样,我有一个名为 MultiProduct 的模型,它具有关联产品变体的功能,如下所示:

    public  function  variants(){
            return  $this->hasMany( 'App\Models\Product', 'multi_product_variant_pivot');
        }
    

    所以发生的事情是我的MultiProductVariant 模型被转换为从MultiProduct 模型激活variants() 函数。我把它改成了:

    public  function  products(){
            return  $this->hasMany( 'App\Models\Product', 'multi_product_variant');
        }
    

    现在它可以工作了,因为它没有被链接!不要问我为什么,我只是这个框架的消费者。疯狂的东西。

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2011-12-17
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多