我有两个表,一个名为"products"
,另一个名为"product_brands"
。
产品有一个品牌,一个品牌可以属于很多产品。
我有:
class Product extends Eloquent {
protected $table = 'products';
public function type() {
return $this->hasOne('ProductTypes');
}
public function brand()
{
return $this->hasOne('ProductBrands', 'id', 'brand_id');
}
public function image() {
return $this->hasMany('ProductImages');
}
public function toArray() {
$ar = $this->attributes;
$ar['type'] = $this->type;
$ar['brand'] = $this->brand;
return $ar;
}
public function getBrandAttribute() {
$brand = $this->brand()->first();
return (isset($brand->brand) ? $brand->brand : '');
}
}
我的控制员:
class ProductsController extends BaseController {
public function index($type_id) {
$Product = new Product;
$products = $Product->where('type_id', $type_id)->get();
return View::make('products.products', array('products' => $products));
}
}
理想情况下,我希望"product_brands"
中的列与"products"
中的列位于同一个数组中,因此我尝试{{1}的原因}和toArray()
但它不起作用。
我该怎么做?
答案 0 :(得分:0)
我确定getBrandAttribute
访问者与brand
关系发生冲突。试试这个:
class Product extends Eloquent {
protected $table = 'products';
public function type() {
return $this->hasOne('ProductTypes');
}
public function productBrand() {
return $this->hasOne('ProductBrands', 'id', 'brand_id');
}
public function image() {
return $this->hasMany('ProductImages');
}
public function getBrandAttribute() {
$brand = $this->productBrand()->first();
return (isset($brand->brand) ? $brand->brand : '');
}
protected $appends = array('brand'); // this makes Laravel include the property in toArray
}
答案 1 :(得分:0)
您应该将访问者更改为其他名称:
public function getSpecBrandAttribute() {
$brand = $this->brand()->first();
return (isset($brand->brand) ? $brand->brand : '');
}
然后在toArray
中你应该使用:
public function toArray() {
$ar = $this->attributes;
$ar['type'] = $this->type;
$ar['brand'] = $this->spec_brand;
return $ar;
}
那是因为你不应该创建与关系名称同名的字段。
此外,由于它是一对多的关系,可能是brand()
,您应该使用belongsTo
而不是hasOne