【问题标题】:Laravel Relationship One to two columnsLaravel 关系一到两列
【发布时间】:2015-10-23 20:48:03
【问题描述】:

我有一个具有 ID 和名称的模型团队。存储所有可能的团队。

我有两列team_1 和team_2 的模型游戏。我需要哪种关系?

我已经测试了很多,但它只适用于一列..

【问题讨论】:

    标签: laravel model laravel-5 relationship


    【解决方案1】:

    也许你可以试试这个:

    class Team extends Model
    {
        protected $table = 'teams';
    
        public function gameOwner()
        {
            return $this->hasMany('App\Games', 'team_1');
        }
    
        public function gameVisitor()
        {
            return $this->hasMany('App\Games', 'team_2');
        }
    
        public function games() {
            return $this->gameOwner->merge($this->gameVisitor);
        }
    
    }
    
    class Game extends Model
    {
        public function teamOvner() {
            return $this->belongsTo('App\Team', 'team_1');
        }
    
        public function teamVisitor() { 
            return $this->belongsTo('App\Team', 'team_2'); 
        }
    
        public function teams() {
            return $this->teamOvner->merge($this->teamVisitor);
        }
    }
    

    【讨论】:

    • @M0riis- 我想你想将hasMany 更改为hasOne 因为game 可能各有一个。
    • 当我使用这个时..我收到了这个错误SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tippsta.team_id' doesn't exist (SQL: select teams.*, team_id.team_1` as pivot_team_1, team_id.team_id as pivot_team_id from @987654332 @inner join team_id on teams.id = team_id.team_id where team_id.team_1 = 1) ` 我想用 $game->team1->name
    • 我已经更新 unswer。尝试。并在控制器中显示您的代码。你想得到什么
    • @M0rtiis 我的解决方案。现在我用 $game->team1->name public function team1() { return $this->belongsTo('App\Team', 'team_1'); } public function team2() { return $this->belongsTo('App\Team', 'team_2'); } 得到它
    • 恭喜。查看更新的答案,也许你会喜欢这种方式
    【解决方案2】:

    您可能需要考虑重新设计数据库结构以满足 Laravel 中关系的意图。

    例如你可以有两个模型

    1) 团队,包含“id”和“name”列(如您所愿)

    2) 游戏,包含“id”和“日期”列(或任何其他特定的游戏标识符,如“名称”,您可以在其中以两支竞争球队的名字命名每场比赛 以 camelCase 为例)。

    那么你会推理如下关系:

    许多球队可以参加给定的比赛(通常是两支球队,但根据体育赛事的性质,每场比赛可能更多),一支球队可以参加不止一场比赛。这将是 Laravel 中多对多关系的一个示例。

    注意:只有您可以根据您所拥有的信息来定义关系的确切性质,但这是对存在多个游戏的关系的有根据的猜测,其中可能有很多每场比赛的球队,以及给定球队能够参加许多比赛的地方(例如,虽然不一定每次都与不同的竞争者对抗)

    那么当你引用模型时

    在您的团队模型中,您将添加关系

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Team extends Model {
    
    public function games()  {
    
    return $this->belongsToMany('App\Game');
    
    }
    
    }
    

    在您的游戏模型中,您将添加关系的倒数

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Game extends Model {
    
    public function teams() {
    
    return $this->belongsToMany('App\Team');
    
    }
    
    }
    

    一旦定义了关系,Laravel 将创建一个名为 game_teams 的连接表

    您可以使用 games 动态属性访问团队的游戏:

    $team = App\Team::find(1);
    
    foreach ($team->games as $game) {
    //
    }
    

    当然,与所有其他关系类型一样,您可以调用 games 方法继续将查询约束链接到关系上:

    $games = App\Team::find(1)->games()->orderBy('name')->get();
    

    另外,在创建迁移时,不要忘记在 createGamesTable 中包含 team_id,以便 Laravel 可以链接两个模型。

    <?php
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateGamesTable extends Migration
    {
    public function up()
    {
    Schema::create('games', function(Blueprint $table) {
        $table->increments('id');
        $table->integer('team_id')->index();
        $table->text('name');
        $table->timestamps();
        });
    

    Eloquent 会尝试将 Game 模型中的 team_id 与 Team 模型中的 id 匹配。 Eloquent 通过检查关系方法的名称并在方法名称后加上 _id 来确定默认的外键名称。

    同样,您需要在 Team 模型中注册 game_id。

    【讨论】:

    • App\Team::where('active', 1)->get()
    • 对不起,上面的代码是一个错字,不知道你会如何去按照你想要的方式设置它。祝你好运!
    猜你喜欢
    • 2020-05-20
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多