laravel 雄辩的数据透视表查询“不明确的列名”

Posted

技术标签:

【中文标题】laravel 雄辩的数据透视表查询“不明确的列名”【英文标题】:laravel eloquent pivot table query "ambiguous column name" 【发布时间】:2015-09-21 05:38:31 【问题描述】:

我正在尝试在用户和产品这两个表之间创建一个数据透视表。但是,当我运行 $user->Cart()->Get(); 时,出现以下错误:

Connection.php 第 631 行中的 QueryException:SQLSTATE[HY000]:常规 错误:1 列名不明确:main.cart.products_id(SQL:选择 "cart".*, "cart"."user_id" as "pivot_user_id", "cart"."products_id" as 来自“cart”的“pivot_products_id”内部连接“cart”到“cart”。“id”= "cart"."products_id" 其中 "cart"."user_id" = 2)

这是用户模型:

class User extends Model implements AuthenticatableContract, CanResetPasswordContract

    ...

    public function Cart()
    
        return $this->belongsToMany('App\Cart', 'cart', 'user_id', 'products_id');
    

产品型号:

class Products extends Model

    ...
    public function Cart()
    
        return $this->belongsToMany('App\Cart', 'cart', 'products_id', 'user_id');
    

购物车模型:

class Cart extends Model

    //
    protected $table = 'cart';

    public function Products()
    
        return $this->hasMany('App\Products', 'products', 'user_id', 'products_id');
    


    public function User()
    
        return $this->hasMany('App\Products', 'users', 'user_id', 'products_id');
    

购物车架构:

        Schema::create('cart', function (Blueprint $table) 

        $table->integer('products_id')->unsigned();
        $table->foreign('products_id')->references('id')->on('products')
            ->onUpdate('cascade')->onDelete('cascade');
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')
            ->onUpdate('cascade')->onDelete('cascade');
    );

【问题讨论】:

【参考方案1】:

在您的 User 模型中,cart() 方法应将 App\Product 作为第一个参数:

class User extends Model implements AuthenticatableContract, CanResetPasswordContract

    public function carts()
    
        // User can have many "products" in cart
        return $this->belongsToMany('App\Product', 'cart', 'user_id', 'products_id'); 
    

产品也一样:

class Product extends Model

    public function carts()
    
        return $this->belongsToMany('App\User', 'cart', 'products_id', 'user_id');
    

然后是您的购物车型号:

class Cart extends Model

    protected $table = 'cart';

    public function product()
    
        return $this->hasMany('App\Product', 'id', 'product_id');
    


    public function user()
    
        return $this->hasMany('App\User', 'id', 'user_id');
    

PS:请注意,最好将模型类名称保持为单数(产品不是产品),方法名称应以小写字母开头(carts 不是 Carts)

【讨论】:

就是这样!非常感谢!

以上是关于laravel 雄辩的数据透视表查询“不明确的列名”的主要内容,如果未能解决你的问题,请参考以下文章

来自DB的Laravel雄辩错误选择数据

使用现有表模式上的数据透视表在雄辩模型中指定关系字段

两个多对多相关表之间的Laravel雄辩关系

Laravel 5 雄辩的多对多关系问题

Laravel Eloquent - 查询数据透视表

Laravel 雄辩查询的高级 where