Я понимаю, как использовать Eloquent для базовых запросов и отношений, но я начинаю запутываться при выборе информации на основе отношений в нескольких таблицах.
Например, я могу получить нужные мне данные из базы данных с помощью построителя запросов следующим образом:
$data['products'] = DB::table('product') ->select('product.id', 'product.ref_num', 'productdetails.name') ->join('productdetails', function($join) { $join->on('product.id', '=', 'productdetails.product_id') ->where('productdetails.website_id', '=', '7'); }) ->leftJoin('product_category', function($join) use($submenu_id){ $join->on('product.id', '=', 'product_category.product_id') ->where('product_category.category_id', '=', $submenu_id); }) ->leftJoin('product_type', function($join) use($type_id){ $join->on('product.id', '=', 'product_type.product_id') ->where('product_type.type_id', '=', $type_id); }) ->get();
В основном, я получаю данные из таблиц продуктов и продуктов, в зависимости от того, какая категория является частью продукта и каким типом продукта он является; Они определяются внутренними соединениями для сводных таблиц product_type и product_category.
Теперь, предполагая, что у меня есть корректные отношения, правильно настроенные, как я буду делать это в Eloquent?
Вот соответствующие части Элементальных моделей
Продукт
class Product extends Eloquent{ public function productdetails() { return $this->hasMany('Productdetail'); public function categories() { return $this->belongsToMany('Category', 'product_category', 'product_id', 'category_id'); } public function types() { return $this->belongsToMany('Producttype', 'product_type', 'product_id', 'type_id'); } }
информация о продукте
class Productdetail extends Eloquent { public function product() { return $this->belongsTo('Product'); } }
Тип продукта
class ProductTypes extends Eloquent{ function products() { return $this->belongsToMany('products', 'product_id', 'type_id', 'product_id'); }
категория
class Category extends Eloquent{ public function products() { return $this->belongsToMany('product', 'product_category', 'category_id', 'product_id'); } }
заранее спасибо
Предполагая, что ваши отношения правильны, а соответствующие имена таблиц: категории и типы, это сделает работу:
Product::with('productdetails') ->whereHas('categories', function ($query) use ($submenu_id) { $query->where('categories.id', '=', $submenu_id); }) ->whereHas('types', function ($query) use ($type_id) { $query->where('types.id', $type_id); // side note: operator '=' is default, so can be ommited }) ->get();
ДеталиProduct::with('productdetails') ->whereHas('categories', function ($query) use ($submenu_id) { $query->where('categories.id', '=', $submenu_id); }) ->whereHas('types', function ($query) use ($type_id) { $query->where('types.id', $type_id); // side note: operator '=' is default, so can be ommited }) ->get();
Он будет запускать 2 запроса (сначала для получения соответствующих продуктов, второй для сведений о продукте, связанных с ними) и возврата Eloquent Collection
//routes.php
/* relationship is : content has images(one to many). And I am extracting the images based on the name that is given in the search input ($keyword = Input::get('keyword') */ $dbresults = DB::table('contents')->join('images', 'images.content_id', '=', 'contents.id')->where('contents.Name', 'LIKE', '%' .$keyword. '%')->get(); return View::make('/results')->with("results", $dbresults);
Посмотреть
@foreach($results as $result) {{ $result->image_1 }} @endforeach