我有三个表,即usersgalleriesorders。结构简单。 galleriesorders都有一个名为client_id的列,作为users的外键
我需要一个结果集,其中仅包含users中而不是galleries中存在的orders列表。
我尝试了以下操作,但是它为我提供了orders中存在的所有用户

$users  =   DB::table('galleries')
        ->join('users', 'users.id', '=', 'galleries.client_id')
        ->join('orders', 'orders.client_id', '=', 'users.id')
        ->select('galleries.client_id', 'galleries.path', 'users.first_name', 'users.last_name', 'orders.order_number')
        ->where('galleries.session_id', null)
        ->where('galleries.is_video', '1')
        ->where('galleries.is_thumb', '0')
        ->get();
    dd($users);


上层代码产生的查询是

    select
  `galleries`.`client_id`,
  `galleries`.`path`,
  `users`.`first_name`,
  `users`.`last_name`,
  users.id,
  `orders`.`order_number`
from
  `galleries`
  inner join
  `users`
    on
      `users`.`id` = `galleries`.`client_id`
    inner join
    `orders`
      on
        `orders`.`client_id` = `users`.`id`
where
  `galleries`.`session_id` is null
  and
  `galleries`.`is_video` = '1'
  and
  `galleries`.`is_thumb` = '0'

最佳答案

这个怎么样?不确定是否有效:

DB::table('galleries')
    ->join('users', 'users.id', '=', 'galleries.client_id')
    ->select('galleries.client_id', 'galleries.path',
             'users.first_name', 'users.last_name')
    ->where('galleries.session_id', null)
    ->where('galleries.is_video', '1')
    ->where('galleries.is_thumb', '0')
    ->whereNotIn('client_id', function($query) {
        $query->select('client_id')
              ->from('orders');
    })
    ->get();


我删除了orders.order_number,因为根据您的要求,您提到了选择用户没有订单的画廊。如果客户没有订单,如何加入订单?

我只是简单地提供了一个附加的whereNotIn,其内容为“订单表中不存在client_id的位置”。

10-07 16:01
查看更多