雄辩的JSON字段一对多关系

时间:2018-12-07 08:58:50

标签: php laravel eloquent

我正在尝试在数据库中的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]

我很可能做错了事,没有正确理解关系。有人可以解释这是如何工作的吗?我查阅了文档,但没有任何明智的选择。

3 个答案:

答案 0 :(得分:1)

我有一个非常好的解决方案,可以将数据保留在json格式的列中。它可以帮助我在以前的项目在线商店上购买

https://scotch.io/tutorials/working-with-json-in-mysql

答案 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;
}