如何修复laravel中的歧义列问题?

5cg8jx4n  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(129)

我做了一个全局作用域来获取列状态= 1的数据。它工作得很好。但是我在代码中遇到了这个问题,我不知道如何解决这个问题:
“留言”:“SQLSTATE[23000]:违反完整性约束:1052 where子句中的列”status“不明确(SQL:选择items .*,item_orders . order_id作为pivot_order_iditem_orders . item_id作为pivot_item_iditem_orders . quantity作为pivot_quantityitems内部连接item_ordersitems . id = item_orders . item_id,其中item_orders . order_id = 1且status = 1 order by id desc)",
下面是我的代码:

$order =  Order::find($id);

       if (is_null($order) || empty($order))
           return ResponseHelper::customizedResponse(false,'4500','No Order is available');

       $user =$order->user_id;

       $place = Place::where('id',$order->place_id)->first();

       $orderItems = ItemOrder::where('order_id',$order->id)->get()->toArray();

       $orderArray = [];
        $itemQ = [];
       foreach ($orderItems as $orderItem)
       {
           $orderArray[] =$orderItem['item_id'];
           $itemQ[] = $orderItem['quantity'];
       }

        $items = Item::whereIn('id',$orderArray)->get();

        $itemP = [];
        foreach ($items as $item)
        {
            $itemP[]= $item->price;
        }

        $totalItem = array_map(function ($price,$quantity){
            return $price * $quantity;
        },$itemP , $itemQ );

        $total = array_sum($totalItem);
        $customer = User::find($user);

        $address = Address::where('user_id',$customer->id)->first();

       return response()->json(['order'=>$order,'place'=>$place,'items'=>$items,'customer'=>$customer,'address'=>$address,'total'=>$total]);

字符串
全球范围:

public function apply(Builder $builder, Model $model)
    {
        if (str_contains(request()->route()->uri(),'api')) {

            $builder->where('status', '=', 1);
        }
    }

au9on6nz

au9on6nz1#

这意味着你在多个表中有status,你需要通过表名指定表的列
就像这样:

$builder->where('item_orders.status', '=', 1);

// In your case: you can use your $model to get the table's name
$builder->where($model->getTable().".status", 1);

字符串

zysjyyx4

zysjyyx42#

一种完全动态和内置的方法是使用Eloquent\Model::qualifyColumn()方法。

$builder->where($model->qualifyColumn('status'), 1);

字符串
不幸的是,它不是静态的,但有一个解决办法的基础上的“技巧”,泰勒建议在这里。

$qualifiedStatusColumn = with(new ItemOrder)->qualifyColumn('status');

$builder->where($qualifiedStatusColumn, 1);


当您正在建立链接,但手边没有模型的执行严修时,这会很有用。
这将通过以下几种方式为您的代码提供未来的支持:
1.如果您更改了表名,此操作仍然有效。(不过,它对更改列名没有帮助。)
1.最后,您可能会将另一个表添加到与查询中的现有表共享列名的联接中。使用此技术可以避免出现此问题中的确切情况。

相关问题