Estoy tratando de escribir una consulta SQL de laravel para unir dos tablas y extraer las columnas que no coinciden de las tablas.
Tabla de productos
| identificación | Nombre |
|---|---|
| 1 | abe |
| 2 | edfg |
| 3 | swfgd |
| 4 | d.f. |
| 5 | fg |
Mesa de compensación
| Identificación de producto | Nombre |
|---|---|
| 2 | edfg |
| 4 | d.f. |
| 5 | fg |
Ahora, espero que la tabla de resultados sea la siguiente.
tabla de resultados
| identificación | Nombre |
|---|---|
| 1 | abe |
| 3 | swfgd |
Puede alguien ayudarme con esto?
Podemos intentar usar un enfoque anti-unión izquierdo aquí:
$users = DB::table('Products p') ->select("p.id", "p.Name") ->leftJoin('Clearings c', function($join) { $join->on('p.id', '=', 'c.Product_id'); $join->on('p.Name', '=', 'c.Name'); }) ->whereNull('c.Product_id'); ->get();Esto correspondería a la siguiente consulta SQL:
SELECT p.* FROM Products p LEFT JOIN Clearing c ON p.id = c.Product_id AND p.Name = c.Name WHERE c.Product_id IS NULL;Te sugiero que crees un modelo para cada mesa.
Para la tabla de productos, cree un modelo usando el comando
php artisan make:model Product Este comando creará un archivo en la app/Models y agregará la relación hasMany
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Product extends Model { use HasFactory; protected $table="Products"; public function clearing(){ return $this->hasMany(Clearing::class,'Product_id','id'); } }y de la misma manera crea un modelo para la mesa de compensación
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Clearing extends Model { use HasFactory; protected $table="Clearing"; }y en tu controlador
$products=Product::whereDoesntHave('clearing')->get()Puedes usar not exists :
select p.* from products p where not exists (select 1 from clearing c where c.product_id = p.id);