我正在尝试在数据库中的JSON字段与通过ID存储音乐的表之间建立连接。因此,我有一个名为“播放列表”的表,该表具有一个名为“歌曲”的字段。在此“歌曲”字段中,我有一个array[]
的歌曲ID,例如[1,2]
。我尝试使用以下代码在这两个表之间建立关系:
class Playlist extends Model
{
protected $table = 'playlists';
public function songs()
{
return $this->hasMany('App\Music', 'id');
}
}
我使用foreign_key
id 是因为歌曲表中有一个 id 字段。
我用来从控制器检索播放列表的代码如下:
$playlist = Playlist::find($id)->songs;
print_r($playlist);
哪个输出:
[1,2]
我很可能做错了事,没有正确理解关系。有人可以解释这是如何工作的吗?我查阅了文档,但没有任何明智的选择。
答案 0 :(得分:1)
我有一个非常好的解决方案,可以将数据保留在json格式的列中。它可以帮助我在以前的项目在线商店上购买
答案 1 :(得分:1)
Laravel不支持JSON关系。
我为此创建了一个包:https://github.com/staudenmeir/eloquent-json-relations
如果将songs
列重命名为song_ids
,则可以定义如下所示的多对多关系:
class Playlist extends Model
{
use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;
protected $casts = [
'song_ids' => 'json',
];
public function songs()
{
return $this->belongsToJson('App\Music', 'song_ids');
}
}
class Music extends Model
{
use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;
public function playlists()
{
return $this->hasManyJson('App\Playlist', 'song_ids');
}
}
答案 2 :(得分:0)
虽然这是一篇很老的帖子,但我会继续为我未来的自己和其他谷歌员工发表我自己的看法......
所以,如果我正确回答了这个问题,那么您正在尝试使用 JSON 字段进行关系查询。这个问题我在不同的场合针对不同的用例偶然遇到过几次。最近的目的是为了在给定表的单个 JSON 字段中保存属于不同表的几个 Id(虽然我一直在思考为什么 Laravel 的家伙不只是添加这个功能!我知道 Pivots ,数据标准化等......但我恳求1%)。直到我在 Laracast 上看到这篇博文,它的效果非常好。
为冗长的介绍道歉,让我直接进入......
在你的播放列表模型(在 Laravel 8.0 和一些我无法真正跟踪的旧版本中)你可以做这样的事情;
public function songs()
{
$related = $this->hasMany(Song::class);
$related->setQuery(
Song::whereIn('id', $this->song_ids)->getQuery()
);
return $related;
}