2013-09-09 2 views
0

Я пытаюсь выбрать вычисляемый столбец на основе столбцов в связанных таблицах.Laravel DB Query Builder translate from mySQL

Это эквивалент в SQL

SELECT 
    *, 
    (p.weight * p.fineness * f.fixam/31.1035) as buy_gram 
FROM 
    products p, fixes f, metals m 
WHERE 
    p.metal_id = m.id AND 
    f.metal_id = m.id AND 
    f.currency_id = :cid 

Это моя попытка до сих пор с помощью Laravel Query Builder.

$products = Product::select(
     ['*',DB::raw('weight * fineness * fixes.fixam/31.1035 as buy_gram')]) 
     ->with(array(
      'metal', 
      'metal.fixes.currency', 
      'metal.fixes' => function($query) use ($currency_id){ 
       $query->where('currency_id', '=', $currency_id); 
      }))->get(); 

    return View::make('admin.products.index')->with('products', $products); 

Я сталкивался с сообщением об ошибке, говоря:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fixes.fixam' in 'field list' (SQL: select *, weight * fineness * fixes.fixam as buy_gram from `products`) (Bindings: array ()) 

Я также пробовал другие комбинации fixes.fixam, таких как metal.fixes.fixam, metals.fixes.fixam

Вопрос 1: Как запросить эту внешнюю таблицу выполнить вычисление с помощью построителя запросов laravel? Вопрос 2: Есть ли какой-либо файл консоли/журнала, который я могу вывести сгенерированный sql для моих запросов в laravel?

+0

'Колонка не найдена. что это сообщение об ошибке сообщает ya? – itachi

+0

10 баллов за указание очевидного. :) Вопрос перефразирован для ясности. – Gravy

ответ

0

Я использовал бы другой подход, используя таблицы inner join. Что-то вроде этого:

DB::table('products') 
     ->join('metals','products.metal_id','=','metals.id','inner') 
     ->join('fixes','fixes.metal_id','=','metals.id','inner') 
     ->where('fixes.currency_id',':cid') 
     ->select(DB::raw('products.*, (products.weight * products.fineness * fixes.fixam/31.1035) as buy_gram')) 
     ->get(); 

Для достижения последнего запроса:

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

Вы также можете использовать профайлер, чтобы увидеть все запросы и больше информации. juy/profiler - это тот, который я использую.