1

我们在一个本地命名表名的数据库上工作。

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每个值,我们可以像访问它一样;$products[$k]->category_name?

谢谢!

4

2 回答 2

1

在您的 Product 模型中创建类别关系:

class Product extends Eloquent {

  private $table = 'myProductsTableName';

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

}

class Category extends Eloquent {

  private $table = 'myCategoriesTableName';

}

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

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

然后只需使用它:

//View (in foreach)
{{ URL::to('uploads/categories/'.$products[$k]->category->category_directory.'/' . $products[$k]->picture) }}
于 2013-06-21T19:17:23.723 回答
1

我要建立关系...

class Product extends Eloquent {

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

 }

class Category extends Eloquent {

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

 }

您在 Realtionship 中使用的名称是模型名称.....所以请确保您使用的表名称与模型名称不同,您在模型中设置了该名称

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
于 2013-06-21T19:28:43.250 回答