【问题标题】:Laravel: get data from related tables (json array column)Laravel:从相关表中获取数据(json数组列)
【发布时间】:2020-12-05 12:47:02
【问题描述】:

我有 2 个相关的表

团队:

| id | name     | game_id       | user_id |
|----|----------|---------------|---------|
| 1  | EA Games | ["1","2"]     | 1       |
| 2  | Nintendo | ["1"]         | 2       |
| 3  | HoG      | ["3","4","5"] | 1       |

游戏:

| id | name     |
|----|----------|
| 1  | Cod MW   |
| 2  | FIFA     |

控制器:

public function showManage()
{
    $teams = Teams::where('user_id', Auth::user()->id)->where('enabled', '!=', 0)->get();
    return view('teams.manage.index', ['teams' => $teams]);
}

查看:

@foreach ($teams as $item)
    <div class="col-md-2 text-center">
      <div class="team-item">
          <div class="team-image">
            <img src="/images/teams/logo/{{$item->logo}}" alt="{{$item->name}}">
          </div>
          <div class="team-text">
            {{$item->name}}
          </div>
        <ul>
          <li> Game Name 1 </li>
          <li> Game Name 2 </li>
          <li> Game Name 3 </li>
        </ul>
      </div>
    </div>
@endforeach

团队模型:

<?php

namespace App;
use App\User;
use App\Games;

use Illuminate\Database\Eloquent\Model;

class Teams extends Model
{

  protected $table = 'teams';


  public function captain()
  {
      return $this->hasOne(User::class, 'id', 'user_id');
  }

  public function game()
  {
      return $this->hasMany(Games::class, 'id', 'game_id');
  }

}

每个用户可以拥有多个具有不同 game_id 的团队,我不想为我的用户显示每个团队的游戏名称

如何加入我的游戏桌?

对不起我的英语不好

【问题讨论】:

    标签: json laravel eloquent


    【解决方案1】:

    拥有一个 json 字段使得使用数据库语句无法做到这一点。

    请注意,JSON 列不能有默认值、不能用作主键、不能作为外键引用或有索引。您可以在生成的虚拟列上创建二级索引,但在单独的字段中保留索引值可能更容易。

    使用当前结构,您唯一的解决方案是循环结果并再次查询游戏。

    更改结构将是一个更好的解决方案,其中您有另一个表game_team,其中团队和游戏的 ID 作为复合键。然后它会像运行它一样简单(使用正确的 belongsToMany 关系)

    $teams = Auth::user()->teams()->with('games')->where('enabled', '!=', 0)->get();
    

    【讨论】:

      【解决方案2】:

      我可以用 foreach 和 for 循环修复它

      控制器:

      public function showManage()
        {
          $teams = Teams::where('user_id', Auth::user()->id)->where('enabled', '!=', 0)->get();
          $array = array();
          foreach ($teams as $v) {
            $data = $v->game_id;
            $array[$v->id] = array(
              'games' => array(
              )
            );
            $games = Games::whereIn('id', $data)->get();
            foreach ($games as $k) {
              array_push($array[$v->id]['games'], $k->name);
            }
          }
          return view('teams.manage.index', ['teams' => $teams, 'data' => $array]);
        }
      

      查看:

      @foreach ($teams as $item)
          <div class="col-md-2 text-center">
            <div class="team-item">
                <div class="team-image">
                  <img src="/images/teams/logo/{{$item->logo}}" alt="{{$item->name}}">
                </div>
                <div class="team-text">
                  {{$item->name}}
                </div>
              <ul>
                @foreach ($data[$item->id] as $v)
                  @for ($i = 0; $i < count($v); $i++)
                   <li> {{$v[$i]}} </li>
                  @endfor
                @endforeach
              </ul>
            </div>
          </div>
          @endforeach
      

      【讨论】:

      • 这不会显示每支球队的所有比赛,即使第一支球队没有参加任何一场比赛。此外,这种糟糕的结构会在你的发展中进一步追捕你。如果游戏被删除会怎样?其参考 (id) 仍将在表中。还有更多问题......评论太长了
      • 这在我的项目中运行良好。数据不会从数据库中删除只是“启用”列从 1 更改为 0 ,用户最多有 5 个团队,所以对于像我这样的小表来说这不会是问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多