从Laravel中的数据库中获取不同的属性

时间:2014-11-11 19:09:00

标签: php mysql laravel laravel-4

我有两个表,一个名为"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()但它不起作用。

我该怎么做?

2 个答案:

答案 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