Laravel Eloquent LEFT JOIN WHERE NULL

Я пытаюсь использовать Eloquent для выполнения следующего запроса во время семени базы данных:

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

И вот моя реализация в Eloquent:

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

В то время как первый запрос всегда возвращает полные результаты, эквивалент Eloquent всегда возвращает пустые элементы для всех, кроме полей email и phone таблицы customers . Я затрудняюсь это объяснять, поскольку модели « Customers и Orders являются скелетами, созданными мастерами.

Пример:

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

Вот массив, который выводится, когда я dd () первый запрос Eloquent на семя (созданный первоначально 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 } 

Solutions Collecting From Web of "Laravel Eloquent LEFT JOIN WHERE NULL"

Это можно решить, указав нужные имена столбцов из конкретной таблицы следующим образом:

 $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' ]); 

Я бы сбросил ваш запрос, чтобы вы могли взглянуть на SQL, который был фактически выполнен, и посмотреть, как это отличается от того, что вы написали.

Вы должны сделать это с помощью следующего кода:

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

Надеюсь, это даст вам достаточно информации, чтобы вы могли понять, что пошло не так.

Вы также можете указать столбцы в списке так:

 $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();