Laravel - Mysql在哪里不加入

时间:2016-10-26 07:10:37

标签: php mysql laravel laravel-5.2 inner-join

我有三张表,即usersgalleriesorders。结构很简单。 galleriesorders都有一个名为client_id的列充当users的外键 我需要一个结果集,其中只包含usersgalleries但不在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'

上层代码生成的查询是

fn pack_item<C: Container>(item: C::Item) -> ItemPacket {
    ItemPacket {  
        container_description: C::describe_container(),
        _payload: item.get_payload(),
    }
}

fn main() {
    let s = pack_item::<ImAContainerType>(ImAnItemType);
    println!("{}", s.container_description);
    let s = pack_item::<ImAnotherContainerType>(ImAnItemType);
    println!("{}", s.container_description);
}

1 个答案:

答案 0 :(得分: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的地方”。