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 的不同表中获取单个数组中的数据