Laravel:Eloquent Relationship错误

时间:2015-10-29 09:36:12

标签: laravel eloquent

我在产品和product_categories表之间存在多对多的关系。现在我想为类别创建一个转换表。

但我如何在雄辩中将它们联系起来呢?我正在学习数据库关系,所以请原谅我的无知。

以下是我的表格:

    //languages
    Schema::create('locales', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('code', 2);
        $table->string('name');
    });

    //products
    Schema::create('products', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('thumbnail');
        $table->timestamps();
    });

    //categories
    Schema::create('product_categories', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('category');
    });

    //relationship table
    Schema::create('product_productcategory', function(Blueprint $table)
    {   
        $table->integer('product_id')->unsigned()->index(); // the id of the bear
        $table->foreign('product_id')->references('id')->on('products');
        $table->integer('product_category_id')->unsigned()->index(); // the id of the picnic that this bear is at
        $table->foreign('product_category_id')->references('id')->on('product_categories');
    });

    //category translations
    Schema::create('category_translations', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name');

        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('product_categories')->onDelete('cascade');

        $table->integer('locale_id')->unsigned();
        $table->foreign('locale_id')->references('id')->on('locales')->onDelete('cascade');

        $table->unique(['category_id', 'locale_id']);
    });

产品型号:

class Product extends Model
{
    protected $table = 'products';

    public function product_category() {
        return $this->belongsToMany('App\product_category', 'product_productcategory')->translation(1);
    }
}

产品类别:

class product_category extends Model
{
    protected $table = 'product_categories';

    public function product() {
        return $this->belongsToMany('App\Product', 'product_productcategory');
    }
}

类别翻译

class Category_Translation extends Model
{
    protected $table = 'category_translations';

    public function product_category() {
        return $this->belongsTo('App\product_category');
    }
}

但是当我跑步时:

$product = App\Product::find(1)->first();
echo $product->product_category;

我收到错误:

Call to undefined method Illuminate\Database\Query\Builder::translation()

1 个答案:

答案 0 :(得分:0)

您不应该在产品型号translation关系中调用category(因为您仍在与查询构建器交互),而应该将该转换作为类别对象上的属性进行访问:

echo $product->product_category->first()->getTranslatedIn(1)->name;

所以你可以像这样重构你的代码:

产品型号:

class Product extends Model
{
     protected $table = 'products';

     public function product_category() {
          return $this->belongsToMany('App\product_category', 'product_productcategory');
     }
}

产品类别:

class product_category extends Model
{
    protected $table = 'product_categories';

    public function product() {
        return $this->belongsToMany('App\Product', 'product_productcategory');
    }

    public function translations() {
        return $this->hasMany('App\Category_Translation', 'category_translations');
    }

    // relation filtered by language (cannot be accessed as a property unless you define the parameter as optional)
    public function translatedIn($language) {
         return $this->hasOne('App\Category_Translation', 'category_id')->where('locale_id', $language);

    }

    // access translated object
    public function getTranslatedIn($language) {
        return $this->translatedIn($language)->getResults();
    }


}