2015-03-26 3 views
1

У меня есть макет таблицы, как так:Laravel присоединяется в том числе там, где нет совпадения

products 
    id 
    productname 

product_weights 
    id 
    productid 
    weight 

product_flavours 
    id 
    productid 
    flavour 

Я пытаюсь создать список всех возможных вариантов продукта. Некоторые продукты не имеют разницы в размере, некоторые из них не имеют изменения вкуса, у некоторых есть и то, и другое. Мое настоящее мышление использует соединение. Я до сих пор для моего запроса:

DB::table('product_weights') 
     ->join('products', 'products.id', '=', 'product_weights.prodid') 
     ->select('product_weights.value', 'products.productname') 
     ->get(); 

Это дает что-то вроде полезно, var_dump дает:

[{"value":"1kg","productname":"Item 1"},{"value":"2.1kg","productname":"Item 2"},{"value":"250g","productname":"Item 3"},{"value":"1kg","productname":"Item 3"} 

Вопрос заключается в том, что продукт item 5 без каких-либо изменений веса не возвращается. И, конечно же, мне нужно строить вкусы.

Затем я хочу просто сделать массив как { 'Пункт 1 1кг', 'Пункт 2 2.1kg', 'Пункт 3 250г', 'Пункт 3 1кг'}

Любые идеи? Мне кажется, что я ошибаюсь. Помощь будет оценена!

Обновление: Благодаря комментариям ниже был достигнут определенный прогресс с leftJoin. Я могу получить желаемые результаты для веса или вкуса, но не для обоих. Код сейчас:

$product_join_weights = DB::table('products') 
    ->leftJoin('product_weights', 'products.id', '=', 'product_weights.prodid') 
    ->select('products.productname', 'product_weights.value') 
    ->get(); 

$product_join_flavour = DB::table('products') 
    ->leftJoin('product_flavours', 'products.id', '=', 'productattributes.prodid') 
    ->select('products.productname', 'product_flavours.value') 
    ->get(); 

Любые идеи, как их можно комбинировать?

+0

'-> leftJoin' возможно. –

+0

@AbhikChakraborty Да, спасибо! Ледяной помог много. Теперь мой вопрос объединяет два. Я обновил свой вопрос. – samiles

ответ

2

Вместо объединения двух массивов, почему не только цепь стыки вместе?

$product_join = DB::table('products') 
     ->leftJoin('product_weights', 'products.id', '=', 'product_weights.prodid') 
     ->leftJoin('product_flavours', 'products.id', '=', 'productattributes.prodid') 
     ->select('products.productname', 'product_flavours.value', 'products.productname', 'product_weights.value') 
     ->get(); 

слева присоединяется принести полный набор записей из table1, с соответствия записей в table2. Результат имеет значение NULL в правой части, если совпадение не будет выполнено.

http://www.w3resource.com/sql/joins/perform-a-left-join.php

1

Я думаю, вы могли бы просто удвоить левый присоединиться ...

что-то вроде этого:

$product_weights_and_flavours = DB::table('products') 
    ->leftJoin('product_weights', 'products.id', '=', 'product_weights.prodid') 
    ->leftJoin('product_flavours', 'products.id', '=', 'productattributes.prodid') 
    ->select('products.productname', 'product_weights.value', 'product_flavours.value') 
    ->get(); 
Смежные вопросы