Обработка картографического стола в Laravel Eloquent - PullRequest
0 голосов
/ 23 сентября 2018

В моем приложении будет несколько инвесторов, помеченных для одной покупки.Таким образом, при загрузке записи о покупке я должен связать всех инвесторов.

В моем контроллере

return response()->json(GoldPurchase::with('investors')->get());

Схема таблицы сопоставления,

Schema::create('gold_purchase_investor', function (Blueprint $table) {
   $table->increments('id');
   $table->integer('investor_id')->unsigned();
   $table->integer('purchase_id')->unsigned();
   $table->timestamps();

   $table->foreign('investor_id')
        ->references('id')
        ->on('investors')
        ->onDelete('cascade');

   $table->foreign('purchase_id')
        ->references('id')
        ->on('gold_purchases')
        ->onDelete('cascade');
});

Модель покупки,

class GoldPurchase extends Model
{
    public function investors() {
        return $this->hasMany('App\GoldPurchaseInvestor');
    }
}

Модель инвестора,

class Investor extends Model
{
    protected $fillable = ['name', 'address', 'mobile', 'email'];

    public function purchases() {
        return $this->hasMany('App\GoldPurchase');
    }
}

Модель PurchaseInvestor,

class GoldPurchaseInvestor extends Model
{
    protected $table = 'gold_purchase_investor';

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

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

При этом я получаю ошибку,

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'gold_purchase_investor.gold_purchase_id' in 'where clause' (SQL: select * from `gold_purchase_investor` where `gold_purchase_investor`.`gold_purchase_id` in (1))

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Вы должны указать пользовательский внешний ключ:

public function investors() {
    return $this->hasMany('App\GoldPurchaseInvestor', 'purchase_id');
}

Но на самом деле это случай отношения BelongsToMany:

public function investors() {
    return $this->belongsToMany('App\Investor', 'gold_purchase_investor', 'purchase_id');
}
0 голосов
/ 23 сентября 2018

Используйте belongsToMany для отношений «многие ко многим».

GoldPurchase.php

class GoldPurchase extends Model{
    public function investors() {
        return $this->belongsToMany('App\Investor','gold_purchase_investor','purchase_id','investor_id');
    }
}

Investor.php

class Investor extends Model{
    protected $fillable = ['name', 'address', 'mobile', 'email'];

    public function purchases() {
        return $this->belongsToMany('App\GoldPurchase','gold_purchase_investor','investor_id','purchase_id');
    }
}

Вам не нужна третья модельдля сводной таблицы вообще.GoldPurchaseInvestor совсем не нужен.

0 голосов
/ 23 сентября 2018

Из Eloquent Relationship :

Помните, Eloquent автоматически определит правильный столбец внешнего ключа в модели Comment.По соглашению, Eloquent возьмет имя «случая змеи» модели-владельца и добавит к ней _id.Так, в этом примере Eloquent предположит, что внешний ключ в модели Comment является post_id.

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

Поэтому попробуйте написать свой внешний ключ и локальный ключ в отношениях

В твоем случае я думаю, что это будет что-то вроде этого:

class GoldPurchase extends Model`
{
    public function investors() {
        return $this->hasMany('App\GoldPurchaseInvestor', 'investor_id', 'id');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...