Laravel Eloquent LEFT JUNTA ONDE NULL

Estou tentando usar o Eloquent para executar a seguinte consulta durante uma semente de database:

SELECT * FROM customers LEFT JOIN orders ON customers.id = orders.customer_id WHERE orders.customer_id IS NULL 

E aqui está a minha implementação em Eloquent:

 $c = Customer::leftJoin('orders', function($join) { $join->on('customers.id', '=', 'orders.customer_id'); }) ->whereNull('orders.customer_id') ->first(); 

Enquanto a primeira consulta sempre retorna resultados completos, o equivalente em Eloquent sempre retorna elementos vazios para tudo, exceto os campos de e- email e phone da tabela de customers . Não estou preocupado em explicar isso, pois os modelos de Customers e Orders são ambos esqueletos gerados por artesãos.

Ex:

 class Customer extends \Eloquent { // Add your validation rules here public static $rules = [ // 'title' => 'required' ]; // Don't forget to fill this array protected $fillable = []; } 

Aqui está a matriz que é emitida quando eu dd () a primeira consulta Eloquent em uma semente (gerada originalmente pelo Faker):

 protected $original => array(25) { 'id' => NULL 'first_name' => NULL 'last_name' => NULL 'email' => string(24) "luther.braun@example.org" 'phone' => string(17) "642.150.9176x5684" 'address1' => NULL 'address2' => NULL 'city' => NULL 'state' => NULL 'county' => NULL 'district' => NULL 'postal_code' => NULL 'country' => NULL 'notes' => NULL 'created_at' => NULL 'updated_at' => NULL 'customer_id' => NULL 'total' => NULL } 

Isso pode ser resolvido especificando os nomes de coluna específicos desejados da tabela específica, assim:

 $c = Customer::leftJoin('orders', function($join) { $join->on('customers.id', '=', 'orders.customer_id'); }) ->whereNull('orders.customer_id') ->first([ 'customers.id', 'customers.first_name', 'customers.last_name', 'customers.email', 'customers.phone', 'customers.address1', 'customers.address2', 'customers.city', 'customers.state', 'customers.county', 'customers.district', 'customers.postal_code', 'customers.country' ]); 

Eu despejaria sua consulta para que você possa ver o SQL que realmente foi executado e ver como isso difere do que você escreveu.

Você deve ser capaz de fazer isso com o seguinte código:

 $queries = DB::getQueryLog(); $last_query = end($queries); var_dump($last_query); die(); 

Espero que isso lhe dê informações suficientes para permitir que você descubra o que está errado.

Você também pode especificar as colunas em uma seleção, assim:

 $c = Customer::select('*', DB::raw('customers.id AS id, customers.first_name AS first_name, customers.last_name AS last_name')) ->leftJoin('orders', function($join) { $join->on('customers.id', '=', 'orders.customer_id') })->whereNull('orders.customer_id')->first();