Laravel:从相关表中获取数据(json数组列)

Posted

技术标签:

【中文标题】Laravel:从相关表中获取数据(json数组列)【英文标题】:Laravel: get data from related tables (json array column) 【发布时间】: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" >
          </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 的团队,我不想为我的用户显示每个团队的游戏名称

如何加入我的游戏桌?

对不起我的英语不好

【问题讨论】:

【参考方案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" >
          </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 个团队,所以对于像我这样的小表来说这不会是问题

以上是关于Laravel:从相关表中获取数据(json数组列)的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 中的数组向数据透视表中的额外列添加条件值

Laravel Eloquent 搜索 JSON 数组以获取特定列的值

Laravel Eloquent:如何从连接表中仅获取某些列

我想从 Laravel 5.7 的不同表中获取单个数组中的数据

如何从sql server中的表中查询json数组类型列的值?

使用单个查询从相关数据库表中回显嵌套的 JSON 数组?