Настольный поворотный стол Laravel - PullRequest
0 голосов
/ 04 июля 2018

Я хочу связать третью таблицу с двумя другими. Поэтому я безуспешно пытался использовать пользовательскую сводную таблицу.

У меня есть три таблицы:

  • Квартира (я называю это "Лот")
  • Этаж (я называю это "Этаж)
  • Поверхность (я называю это "Фракция")

Мои отношения:

  • Лот имеет много этажей (дуплекс)
  • Лот имеет много фракций
  • Etage имеет много лота
  • Etage имеет много фракций
  • Фракция имеет один этап
  • Фракция имеет один лот

И мои модели прямо сейчас:

class Lot extends Model
{
    public function etages(){
        return $this->belongsToMany('App\Models\Copro\Etage');
    }

    public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
    if ($parent instanceof Event) {
        return new EtageLot($parent, $attributes, $table, $exists);
    }
    return parent::newPivot($parent, $attributes, $table, $exists);
    }
}

class Etage extends Model
{
    public function lots()
    {
        return $this->belongsToMany('App\Models\Copro\Lot');
    }

    public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
        if ($parent instanceof User) {
            return new EtageLot($parent, $attributes, $table, $exists);
        }
        return parent::newPivot($parent, $attributes, $table, $exists);
     }
}

class EtageLot extends Pivot
{

    protected $table = 'etage_lot';

    public function lot(){
        return $this->belongsTo('App\Models\Copro\Lot');
    }

    public function etage(){
        return $this->belongsTo('App\Models\Copro\Etage');
    }

    public function fractions()
    {
        return $this->hasMany('App\Models\Copro\Fraction','etage_lot_id');
    }
}

class Fraction extends Model
{

    public function type(){
        return $this->belongsTo('App\Models\Copro\Type');
    }

    public function EtageLot(){
        return $this->belongsTo('etage_lot','etage_lot_id');
    }

}

Но каждый раз, когда я пытаюсь открыть страницу на своем сайте, которая использует одну из этих моделей, у меня появляется эта ошибка:

Объявление App \ Models \ Copro \ Lot :: newPivot (App \ Models \ Copro \ Eloquent $ parent, массив $ attribute, $ table, $ существующие) должно быть совместимо с Illuminate \ Database \ Eloquent \ Model :: newPivot (Подсветка \ База данных \ Eloquent \ Model $ parent, атрибуты $ array, $ table, $ существующие, $ using = NULL)

Я не нахожу что-то полезное, чтобы помочь мне. Я пытался переписать свои таблицы, но это не работает лучше.

Кто-то знает, почему у меня возникает эта ошибка и как использовать эту сводную таблицу, чтобы получить все дроби для квартиры, например?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете достичь этого без использования модели Pivot.

class Lot extends Model
{
    public function etageLots(){
        return $this->hasMany('App\Models\Copro\EtageLot');
    }

    public function fractions()
    {
        return $this->hasManyThrough('App\Models\Copro\Fraction','App\Models\Copro\EtageLot', 'etage_id', 'etage_lot_id');
    }
}

class Etage extends Model
{
    public function lotEtages()
    {
        return $this->hasMany('App\Models\Copro\EtageLot');
    }

}

class EtageLot extends Model
{

    protected $table = 'etage_lot';

    public function lot(){
        return $this->belongsTo('App\Models\Copro\Lot');
    }

    public function etage(){
        return $this->belongsTo('App\Models\Copro\Etage');
    }

    public function fractions()
    {
        return $this->hasMany('App\Models\Copro\Fraction','etage_lot_id');
    }
}

class Fraction extends Model
{

    public function type(){
        return $this->belongsTo('App\Models\Copro\Type');
    }

    public function EtageLot(){
        return $this->belongsTo('App\Models\Copro\EtageLot','etage_lot_id');
    }

}

Выборка данных

$apartment = Lot::with('etageLots','etageLots.etage', 'fractions')->first();
dd($apartment->fractions);
foreach($apartment->etageLots as $etageLot){
    dd($etageLot->etage);
}

Все квартиры с количеством дробей

$apartments = Lot::with('etageLots','etageLots.etage', 'fractions')->withCount('fractions')->get();

foreach($apartments as $apartment){
    dd($apartment->fractions_count);
    dd($apartment->fractions); //direct fractions for each apartment
    foreach($apartment->etageLots as $etageLot){
        dd($etageLot->etage);
    }
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...