Laravel BelongsToMany错误 - 找不到基表或视图

时间:2015-10-28 12:55:56

标签: laravel eloquent

我希望这个帖子能让每个人都健康。

以下代码有什么问题?我的多对多关系出错了。在过去的4个小时里,我遇到了这个问题。如果您发现问题的错误或来源,我将非常感激。

这是我的代码和表格:

Schema::create('products', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('category');
        $table->string('thumbnail');
        $table->string('images');
        $table->string('logo');
        $table->string('main_photo');
        $table->timestamps();
    });

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

    //relationship table
    Schema::create('product_productcategory', function(Blueprint $table)
    {
        $table->increments('id');

        $table->integer('product_id'); // the id of the bear
        $table->integer('productcategories_id'); // the id of the picnic that this bear is at
    });

产品型号:

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

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

}

和枢轴模型

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

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

}

提前致谢!

更新:@mimo解决了这个问题。 但现在我想翻译不同语言的类别,所以我创建了一个这样的表:

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_category extends Model
{
protected $table = 'product_categories';

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

public function translation($lang) {
    return $this->hasMany('App\Category_Translation')->where('locale_id', '=', $lang);
}

}

在类别翻译中:

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

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

最后我的产品:

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

public function translation($lang) {
    return $this->hasMany('App\Product_Translation')->where('locale_id', '=', $lang);
}

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

}

现在我跑的时候:

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

我收到错误:

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

1 个答案:

答案 0 :(得分:5)

您的迁移文件错误:

//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('productcategories_id')->unsigned()->index(); // the id of the picnic that this bear is at
    $table->foreign('productcategories_id')->references('id')->on('product_categories');
});

此代码将在数据库级别建立关系。

如果您有12分钟的空闲时间,您可以查看本教程,了解laravel中的多对多关系: https://laracasts.com/series/laravel-5-fundamentals/episodes/21

更新

你也需要更新你的关系:

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');
    }   

}