如何将两个表与我的Eloquent查询组合在一起?

时间:2013-06-21 19:10:02

标签: php laravel laravel-4

我们处理一个表名在本地命名的数据库。

table.product
-- id
-- picture
-- category_id

table.category
-- id
-- caterory_name
-- category_directory

表中有一些产品。 product.category_id应指向category.id,以便系统了解该产品属于所需的表格。

我们可以通过使用INNER JOIN来实现这一点,但我们无法使用Laravel。我们可能需要使用has / belongs_to等配置我们的模型。

这是我们奋斗的地方。

//Controller
$products = Product::all();

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

//View (in foreach)
{{ URL::to('uploads/categories/[NEED_CATEGORY.CATEGORY_DIRECTORY_HERE]/' . $products[$k]->picture) }}

由于我们仅通过Category.category_directory,因此我们无法在视图中获得Product::all()个信息。

我们如何才能使$ products数组也为每个值包含category.category_directory,我们可以像访问它一样访问它; $产品[$ K] - > CATEGORY_NAME

谢谢!

2 个答案:

答案 0 :(得分:1)

在产品型号中创建类别关系:

class Product extends Eloquent {

  private $table = 'myProductsTableName';

  public function category()
  {
    return $this->belongsTo('Category', 'myCategoryColumnID');
  }

}

class Category extends Eloquent {

  private $table = 'myCategoriesTableName';

}

除非您需要选择特定类别的所有产品,否则您无需在类别模型上创建hasMany关系。

如果您的products表不遵循singular_table_name_id规则(product_id),您只需要使用myCategoryColumnID。

然后使用它:

//View (in foreach)
{{ URL::to('uploads/categories/'.$products[$k]->category->category_directory.'/' . $products[$k]->picture) }}

答案 1 :(得分:1)

我会建立一种关系...

class Product extends Eloquent {

 public function category()
 {
  return $this->belongsTo('Category');
 }

 }

class Category extends Eloquent {

 public function product()
 {
  return $this->hasMany('Product');
 }

 }

您在真实关系中使用的名称是型号名称.....所以请确保您使用的是与您的型号名称不同的表名,并在模型中设置该名称

protected $table = "yourtablename";

然后像这样使用它......

{{ URL::to('uploads/categories/'.$products[$k]->category->category_directory.'/' 

你仍然最终以这种方式多次查询数据库...这称为N + 1效果。例如,如果您有5个产品,将执行一个查询以获取这些产品。然后在循环中我们执行查询以获取类别。这导致总共6次查询。

要解决此问题,请使用预先加载,这会将我们示例中的6个查询减少到2个。

 $products = Product::with('category')->get();

然后将其发送到您的视图,您可以在其中进行foreach循环..

 foreach($products as $val){
 //To output the directory
 echo $val->category->category_directory;

 }

或者在刀片......

@foreach($products as $val)
{{URL::to('uploads/categories/'.$val->category->category_directory.'/'.$val->picture)}}
@endfor