Получить данные отношений из withPivot в сводной таблице многие-ко-многим - PullRequest
0 голосов
/ 14 июня 2019

TL / DR: У меня есть отношение многие ко многим между двумя моделями, использующими withPivot и и using.Я хочу получить связанные данные из значения withPivot из внешнего ключа.


Я работаю с проектом с несколькими арендаторами, который имеет базу данных master и базы данных tenant.

Любая модель в App\Tenant\ в настоящее время использует атрибут $connection.

У меня есть следующая структура моих моделей и связанных с ними таблиц:

- App/Tenant/Match
- App/Tenant/MatchTeam
- App/Team
- App/Ground

соотношение между team и match равно many-to-many

(team может воспроизводить несколько matches, а match может иметь много teams)

Match.php

namespace App\Tenant
class Match extends TenantModel

public function teams() {
    return $this->belongsToMany(Team::class, 'tenant.match_team', 'match_id', 'team_uuid')
                ->using(MatchTeam::class)            
                ->withPivot('ground_id');
}

Team.php

namespace App
class Team extends Model

protected $primaryKey = 'uuid';

public $incrementing = false;

public function grounds() {
    return $this->hasMany(Ground::class, 'team_uuid', 'uuid');
}

public function matches() {
    return $this->belongsToMany(Match::class, 'tenant.match_team', 'team_uuid', 'match_id')
                ->using(MatchTeam::class)            
                ->withPivot('ground_id')
                ;
}

MatchTeam.php

class MatchTeam extends Pivot 

protected $connection = 'tenant';
protected $table = 'match_team';

public function ground() {
    return $this->hasOne(Ground::class);
}

таблица match_team:

| id |     team_uuid      | match_id | ground_id | 
|----| ------------------ | -------- | --------- |
| 1  | kajdnfgkasdnfadsgn |    1     |    NULL   |
| 2  | lsdjfgsadlkfjglsdj |    2     |     4     |
| 2  | kshdfkjdshfytufjek |    3     |     1     |

ВОПРОС:

Как получить доступ к наземным данным, связанным с *Поле 1056 * в сводной таблице match_team?

Я в основном стремлюсь к чему-то вроде match->ground->name, который является отношением к внешнему ключу в таблице match_team.


Я пробовал следующее:

MatchController.php

public function show(Match $match) {
    $match = Match::where('id', $match->id)->with('ground')->first();
}

Но это дает Call to undefined relationship [ground]


DD ($ match), как указано ниже

Interaction {#215 ▼
#table: "matches"
#connection: "tenant"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:19 [▶]
#original: array:19 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: array:1 [▼
    "ground" => null
]
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [▶]
}

1 Ответ

0 голосов
/ 14 июня 2019

Как говорилось в вашей ошибке, в модели соответствия нет наземных отношений Так что в вашем Совпадении Модель

public function ground() {
    return $this->hasOne(Ground::class,'foreign_key', 'local_key');
}

EDITED

Так как я не знаю структуру таблицы

МОЖЕТ БЫТЬ ЭТО ПОМОЖЕТ ВАМ

МЕТОД ОДИН:

if(! is_null($match->pivot->ground))
{
  $groundName = $match->pivot->ground->name;
}else{
    $groundName = 'Ground Not Set';
}

МЕТОД ВТОРОЙ:

$groundName = $match->ground['name'] ??  'Ground Not Set';
...