Я пытаюсь использовать 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 }
Это можно решить, указав нужные имена столбцов из конкретной таблицы следующим образом:
$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();