Laravel插入三向枢轴表

时间:2014-05-11 13:25:27

标签: mysql database laravel tags pivot-table

摘要

我正在构建音乐发现服务。我的问题是:如何将数据插入三向数据透视表 Tag_Track_User

模式

我看到here at LaravelSD

这个模式

它由六个主要表格(以及其他一些表格)组成: 艺术家,专辑,曲目,标签,用户和Tag_Track_User

Schema

艺术家 - >专辑 - >曲目关系非常简单,正如您所期望的那样。

标签,曲目和用户都是相互关联的,因为没有第三个就不能存在。

关系

艺术家 hasMany() 相册

相册 hasMany() 曲目 belongsTo() 艺术家 < / p>

曲目 belongsTo() 相册

曲目 belongsToMany() 代码 belongsToMany() 用户 < / p>

标签 belongsToMany() 曲目 belongsToMany() 用户 < / p>

用户 belongsToMany() 标记 belongsToMany() 曲目 < / p>

模型

用户模型

public function tags()
{
    return $this->belongsToMany('Tag', 'tag_track_user', 'user_mdbid', 'tag_mdbid')->withPivot('track_mdbid');
}

/**
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function tracks()
{
    return $this->belongsToMany('Track', 'tag_track_user', 'user_mdbid', 'track_mdbid')->withPivot('tag_mdbid');
}

标记跟踪模型包含相同的关系。

问题

所以我的问题是:

如何将数据插入 Tag_Track_User 表? tag_track_user 表是一个3向数据透视表,其中包含有关用户标记的曲目的信息。

您必须登录才能标记曲目(这意味着我可以访问用户的ID)。当我在包含表单的页面上显示轨道ID时,将访问轨道ID。另一方面标签;如果它已经存在于tags表中,我想获取它的ID并重新使用它(因为它们是唯一的),如果没有,我想创建它,为它分配一个ID并将其插入tag_track_user_table。

  1. 我需要检查标记是否存在
  2. 如果是,请获取它的ID
  3. 将数据插入 Tag_Track_User
  4. 谢谢

    我收到的任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:2)

好:

$tag = Tag::firstOrCreate(array('text' => $tag_text));

TagTrackUser::create(array(
    "tag_mdbid" => $tag->mdbid,
    "track_mdbid" => $track->mdbid,
    "user_mdbid" => Auth::user()->mdbid
));

那样的东西? firstOrCreate做了它的名字所做的事情,其余的是非常直接的Eloquent。

答案 1 :(得分:0)

由于Laravel似乎没有合适的模式,更简洁的方法是通过专用于数据透视表的模型实现任何三个透视关系:

class Track
public function trackTags()
{
    return $this->hasMany('TagTrack');
}

...
class Tag
public function tagTracks()
{
    return $this->hasMany('TagTrack');
}

...
class TagTrack
public function track()
{
    return $this->belongsTo('Track');
}
public function tag()
{
    return $this->belongsTo('Tag');
}
public function anotherRelationship(){
...
}

你可以这样做:

$track->trackTags->myCustomPivotDataAndRelationship()

在TagTrack中你可以自由添加我想要的关系和字段

请注意,当您不需要访问枢轴关系时,您仍然可以使用多对多