Eloquent关联中外键非默认值时无法访问关联表问题
问题
在Laravel的Eloquent中配置了User与Item的一对多关联,但将Item表的外键设为customer_id而非默认的user_id。尝试在Blade模板中访问User对象的items属性时,出现SQL错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'items.user_id' in 'where clause'
生成的SQL语句仍在查找默认的user_id字段,相关代码如下:
Item.php
public function customer(){ return $this->belongsTo(User::class,'customer_id'); }
User.php
public function items(){ return $this->hasMany(Item::class); } public function get_user($user_name){ return User::where("user_name",$user_name)->first(); }
Item表迁移文件
public function up() { Schema::create('items', function (Blueprint $table) { $table->id(); $table->foreignId('wine_id')->constrained(); $table->foreignId('customer_id')->constrained('users'); $table->integer('quantity'); $table->timestamps(); }); }
UserController.php
// ... $user = $user_model->get_user($request->user_name); $request->session()->put("user",$user); // ...
Blade模板
<?php $items = session('user')->items; $empty_cart = true; foreach($items as $item){ if($wine->id==$item->customer_id){ $empty_cart = false; return; } } var_dump($empty_cart); ?>
解决方案
问题出在User模型的items关联方法里,Eloquent默认会使用关联模型名加_id作为外键(也就是user_id),你没有指定自定义的外键字段,所以需要在hasMany方法里明确指定外键为customer_id:
修改User.php中的items方法:
public function items(){ return $this->hasMany(Item::class, 'customer_id'); }
另外,Blade模板里的判断逻辑存在错误:$wine->id==$item->customer_id中,customer_id是User的ID,并非Wine的ID,应该改为判断$wine->id == $item->wine_id;同时return会直接终止整个循环,导致后续项无法被检查,建议换成break:
修改Blade模板代码:
<?php $items = session('user')->items; $empty_cart = true; foreach($items as $item){ if($wine->id == $item->wine_id){ $empty_cart = false; break; } } var_dump($empty_cart); ?>
内容的提问来源于stack exchange,提问作者Marko Stojanovic
相关产品推荐
相关产品推荐

