我们处理一个表名在本地命名的数据库。
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
谢谢!
答案 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