Laravel Отношения со столом - PullRequest
0 голосов
/ 07 марта 2019

Я в настоящее время борюсь, потому что я совсем новичок в отношениях в Ларавеле.У меня есть модель Products, которая изготовлена ​​из одного модельного материала.Материал может использоваться в нескольких продуктах.

У меня есть таблица с названием product_material, чтобы связать их.

Что у меня есть В продукте

public function material()
{
    return $this->hasOne(Material::class, '');
}

В материале

 public function products(){
    return $this->hasMany(Product::class, 'product_material');
}

Но из-за этого я могу сказать, что в моей таблице материалов нет ни одного product_id.

Но: в моем материале не должно быть product_id, так как при создании он не связан ни с чем и может использоваться в нескольких продуктах

Редактировать: структура БД

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

Schema::create('materials', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->softDeletes();
        $table->string('code',45);
});
Schema::create('product_material', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->softDeletes();
        $table->integer('product_id');
        $table->integer('material_id');
    });

Ответы [ 5 ]

2 голосов
/ 07 марта 2019

Вы используете неправильные отношения и неправильную схему

Если в 1 товаре несколько материалов, то должно быть ( 1 - много )

теперь у одного материала есть много товара, поэтому отношение должно быть

Короче говоря, один продукт имеет несколько материалов, и один материал имеет несколько продуктов, поэтому, наконец, отношение должно быть:

МНОГО-МНОГИЕ и используйте БОЛЬШОЕ-МНОГО


1 голос
/ 07 марта 2019

попробуйте это

public function products(){
    return $this->hasMany('App\Product', 'id','product_id');
}
1 голос
/ 07 марта 2019

Если вы уверены, Продукт будет когда-либо иметь только один Материал, то это будет принадлежать / иметь много отношений.У товара может быть один материал, но у материала может быть много товаров.

Поэтому вам не понадобится сводная таблица;Ваша таблица products будет иметь material_id, который будет внешним ключом к таблице materials.

class Material extends Model
{
    public function product()
    {
        return $this->hasMany(Product::class);
    }
}
class Product extends Model
{
    public function material()
    {
        return $this->belongsTo(Material::class);
    }
}
0 голосов
/ 07 марта 2019

Модель Product.php

public function materials()
{
   return $this->belongsToMany(Material::class, 'product_material');
}

Вы можете напрямую получить materials со своего product стола

Модель ProductMaterial.php

public function material()
{
        return $this->belongsTo(Material::class, 'material_id');
}

public function product()
{
        return $this->belongsTo(Product::class, 'product_id');
}

См .: Красноречивые отношения Ларавела

0 голосов
/ 07 марта 2019

Вы указали здесь пустую строку.

public function material()
{
    return $this->hasOne(Material::class);
}

Если вы не хотите указывать какой-либо ключ, например product_id, то вы указали этот ключ как дополнительные параметры, указывающие на некоторую таблицу идентификаторов.

как это

return $this->hasMany('App\Comment', 'foreign_key', 'local_key');

Для мотылька Красноречивые отношения Ларавела

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...