Laravel中使用Left Join关联两表后左表主键ID丢失的问题
解决Left Join后左表主键id丢失的问题
嘿,这个问题我太熟了!你遇到的是Laravel查询构建器里常见的字段名冲突问题——因为你的products表和manufacturers表都有id字段,当用leftJoin的时候,查询结果里的id会被后面的manufacturers表的id给覆盖掉,所以你看不到products的主键id了。下面给你两种靠谱的解决方案:
方案一:给冲突字段起别名(直接修改Join查询)
你可以在查询时明确指定要选择的字段,给products表的id起一个独特的别名,避免被覆盖。修改后的控制器代码如下:
$prod_manu = $request->prod_manu; return $data = Product::leftJoin('manufacturers','products.Manufacturer_id','=','manufacturers.id') ->select('products.id as product_id', 'products.*', 'manufacturers.*') // 给products的id起别名 ->where('products.Manufacturer_id',$prod_manu) ->get();
这样返回的结果里,product_id就是原products表的主键id,同时还能保留manufacturers表的id字段,两者不会冲突。
方案二:使用Eloquent关联(更符合Laravel最佳实践)
其实Laravel的Eloquent关联就是为了避免这种join带来的字段冲突问题,你可以先在Product模型里定义和Manufacturer的关联关系:
class Product extends Model{ public function types(){ return $this->belongsTo('App\Types','Type_id'); } // 添加厂商关联 public function manufacturer(){ return $this->belongsTo('App\Manufacturer', 'Manufacturer_id'); } }
然后控制器里就不用写join了,直接用with()加载关联数据:
$prod_manu = $request->prod_manu; return $data = Product::with('manufacturer') ->where('Manufacturer_id', $prod_manu) ->get();
这种方式返回的每个Product对象里,会嵌套一个manufacturer属性,里面是对应的厂商数据,完全不会有字段冲突,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者lp-pixel
相关产品推荐
相关产品推荐

