Laravel Несколько столбцов ссылок в другой таблице с отношениями? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать таблицу лиги в Laravel, но у меня снова возникают проблемы с догадками, отношениями, снова.Кажется, они никогда не работают на меня в Ларавеле.Как будто они меня ненавидят.

У меня есть модал для матчей

<?php

namespace App\Database;

use Illuminate\Database\Eloquent\Model;

class Match extends Model
{
    protected $primaryKey = 'id';

    protected $table = 'matches';
    public $timestamps = false;
    protected $guarded = ['id'];
}

И модал для команд, но с функцией match ()

<?php

namespace App\Database;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
    protected $primaryKey = 'id';

    protected $table = 'teams';
    public $timestamps = false;
    protected $guarded = ['id'];

    public function matches() {
        return $this->hasMany('App\Database\Match', 'team_one_id, team_two_id');
    }
}

Iдумаю, что проблема связана с team_one_id, team_two_id, поскольку первичный ключ команды может находиться в одном из столбцов другой таблицы.При вызове count() для matches() выдается ошибка.

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'match.team_one_id, team_two_id' в 'выражении where' (SQL:выберите количество (*) в качестве совокупности из matches, где matches. team_one_id, team_two_id = 1 и matches. team_one_id, team_two_id не равно нулю)

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Таким образом, вы можете реализовать это, добавить эти отношения и метод в Team Model

 public function homeMatches() {
    return $this->hasMany('App\Database\Match', 'team_one_id');
 }

 public function awayMatches() {
    return $this->hasMany('App\Database\Match', 'team_two_id');
 }

 public function matches() {
    return $this->homeMatches->merge($this->awayMatches);
 }

Теперь получить данные

$team = Team::find(1);
$matches = $team->matches(); //now it will fetch all matches for both columns

Если вы хотите выбрать совпадения в качестве атрибутов, вы можете добавить один метод в модель вашей команды

public function getMatchesAttribute()
{
   return $this->homeMatches->merge($this->awayMatches);
}

Теперь вы можете выбрать совпадения как $matches = $team->matches;

Вот разница

$team->matches возврат Illuminate\Database\Eloquent\Collection

И

$team->matches() возврат Illuminate\Database\Eloquent\Relations\{Relation Name}

Вы не можете использовать matches в загрузке Eager, как Team::with('matches'), потому что matches не является отношением и является причиной вашей ошибки.Что вы можете сделать, это добавить homeMatches и awayMatches в нетерпеливой загрузке, а затем позвонить $team->matches().

$teams = Team::with('homeMatches', 'awayMatches')->get(); 
$teams->each(function ($team) {
    print_r($team);
    print_r($team->matches()); 
});
0 голосов
/ 14 июня 2018

Есть ли в таблице соответствия столбец с названием team_id?потому что это стандартное соглашение об именах в документах laravel для отображения таблиц.

если у вас есть столбец и заполняете данные, вы можете просто удалить внешние и локальные ключи из отношения match ().тебе это не нужноLaravel автоматически отобразит его для вас.

, если у вас нет 'team_id' в таблице матчей, пожалуйста, добавьте столбец и добавьте соответствующие идентификаторы команд для матчей.

<?php

namespace App\Database;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
    protected $primaryKey = 'id';

    protected $table = 'teams';
    public $timestamps = false;
    protected $guarded = ['id'];

    public function matches() {
        return $this->hasMany('App\Database\Match');
    }
}
0 голосов
/ 13 июня 2018

вы можете попробовать этот синтаксис

вернуть $ this-> hasMany ('modelPath', 'foreign_key', 'local_key');

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