mercredi 21 mars 2018

In Laravel only one of two joins work when the second parameter is a function with LIKE

I have one search term $term.

I have 3 tables.

1st is vehicles and has id (int, autoincr., unique), vehicle_id (int) - which can be identical, vehicle_type (int) - can be 1 or 2 - 1 denotes car and 2 is for motorcycle

2nd is cars and has id (int, autoincr., unique), title - (varchar)

3nd is motorcycles and has id (int, autoincr., unique), title - (varchar)

Now, I want to use the 1st table's vehicle_id (vehicle.vehicle_id) and join it with the 2nd table's id (cars.id) but only under the condition that the vehicle_type is 1 (car). And at the same time the car's title should contain the $term using LIKE.

And at the same time I want to join 1st table's vehicle_id (vehicle.vehicle_id) with the 3rd table's id (motorcycles.id) but only under the condition that the vehicle_type is 2 (motorcycle). And at the same time the motorcycle's title should contain the $term using LIKE.

So far, I have this code:

$result = DB::table('vehicles')->join('cars', function($join) use($term)
                                {
                                    $join->on('vehicles.vehicle_id', '=', 'cars.id') 
                                         ->where('vehicles.vehicle_type', '=', '1')
                                         ->where('cars.title', 'LIKE', '%' . $term . '%');
                                })
                               ->join('motorcycles', function($join2) use($term)
                                {
                                    $join2->on('vehicles.vehicle_id', '=', 'motorcycles.id')
                                         ->where('vehicles.vehicle_type', '=', '2')
                                         ->where('motorcycles.title', 'LIKE', '%' . $term . '%');
                               })
                               ->get();

The problem is that when I have a car and a motorcycle that have the same name and teh $term contains part of it, only the car is catched. If I comment the cars join part the motorcyle is shown, but I want both. How to do that?

Why is the second join being ignored?

Because this works:

$result = DB::table('vehicles')->join('cars', function($join) use($term)
                                    {
                                        $join->on('vehicles.vehicle_id', '=', 'cars.id') 
                                             ->where('vehicles.vehicle_type', '=', '1')
                                             ->where('cars.title', 'LIKE', '%' . $term . '%');
                                    })

                                    ->get();

And this works too:

$result = DB::table('vehicles')->join('motorcycles', function($join2) use($term)
                                    {
                                        $join2->on('vehicles.vehicle_id', '=', 'motorcycles.id')
                                             ->where('vehicles.vehicle_type', '=', '2')
                                             ->where('motorcycles.title', 'LIKE', '%' . $term . '%');
                                   })
                                   ->get();

But not when used 2 joins in a row. Why?



from Newest questions tagged laravel-5 - Stack Overflow http://ift.tt/2puqRqG
via IFTTT

Aucun commentaire:

Enregistrer un commentaire