当前位置: 首页 > 知识库问答 >
问题:

拉维尔三台枢轴

吴俊风
2023-03-14

我正在使用Laravel创建一个音乐搜索/发现网站。简言之,艺术家们有许多专辑,其中有许多曲目。用户有许多与轨迹关联的标记。标记只能在曲目上进行,而不能在专辑或艺术家上进行。

用户访问网站,并可以搜索一组标签,例如。“快乐”、“派对”、“学校”。将返回轨道列表以及一些其他详细信息。

用户首先对轨迹进行标记。用户应该能够看到他们标记的所有曲目,并且能够根据标记进行搜索/过滤。

使用我目前的设置(见下面的表结构),无法判断哪个用户标记了特定的曲目。我正在考虑把两张桌子tag_track和tag_user合二为一。新表格的结构如下:

Tag_ID
Track_ID
User_ID
  1. 如果我这样做,我在模型上建立了什么关系
  2. 我怎样才能得到与标签相关的所有轨道(tags.text)
User_ID (UNI)
User_Name
Artist_ID (UNI)
Artist_Name
Album_ID (UNI)
Album_Title
Artist_ID
Track_ID (UNI)
Track_title
Album_ID
Tag_ID (UNI)
Tag_text (UNI)
Tag_ID
Track_ID
Tag_ID
User_ID

他有很多缺点

属于这张专辑有很多曲目

属于这张专辑有很多曲目

属于许多标签

属于多个曲目属于多个用户

共有1个答案

松亦
2023-03-14

关于透视表你是对的。它必须包含3个键,因为在这种情况下,标签不能没有用户或轨道。所以这是3个模型之间的关系。

以下是您所需的全部内容(我将跳过艺术家和专辑之间的关系):

// pivot table tag_track_user: tag_id, track_id, user_id, id, timestamps

// Tag model
public function users()
{
    // by default only 2 keys are on the pivot, so lets add the third
    return $this->belongsToMany('User', 'tag_track_user')->withPivot('track_id'); 
}

public function tracks()
{
    return $this->belongsToMany('Track', 'tag_track_user')->withPivot('user_id'); 
}
------------
// Track model
public function tags()
{
    return $this->belongsToMany('Tag', 'tag_track_user')->withPivot('user_id'); 
}

public function users()
{
    return $this->belongsToMany('User', 'tag_track_user')->withPivot('tag_id'); 
}
------------
// User model
public function tags()
{
    return $this->belongsToMany('Tag', 'tag_track_user')->withPivot('track_id');
}

public function tracks()
{
    return $this->belongsToMany('Track', 'tag_track_user')->withPivot('tag_id'); 
}

现在,通过此设置,您可以获得所需的一切:

$user->tags->first()->users; // other users who used given tag
Tag::where('name','happy')->first()->tracks; // all tracks tagged 'happy'
$user->tracks()->where('title','Happy')->first()->tags; // all tags attached to song Happy
$user->tags->load('tracks')->fetch('tracks')->collapse(); // array of all the tracks related to all tags of a user (as arrays not models)
etc.

当然,上述操作会导致一些db查询,但这是正常的。

 类似资料:
  • 在Laravel中,有可能把关系放在关系中吗? 我的两个模型: 商店 供应商 我的商店和供应商关系模型: null 正如您所看到的,我有许多商店和供应商,每个都可以通过SupplierStore表相互关联。 这很好用。 我的问题是,对于每一个关系(商店和供应商),可能有许多交货日。 我想如果我进入SupplierStore模型并添加: 会工作,但我似乎没有办法通过雄辩来访问这些数据? 我希望做这样

  • 所以我正在尝试为我的网站实现一个支付解决方案,经过相当多的研究,我仍然缺乏一个完整的解决方案。我正在运行Laravel 5.0,需要一般购物车付款功能。我想我会发布这篇文章,试图创建一个参考,以帮助其他可能有这个问题的人。我已经把测试事务放到了Paypal的沙箱中,这似乎是砖墙的所在,但是一个完整的概述会很有帮助。我将列出我需要克服的问题,以便解决一些问题。 完成支付解决方案实施需要解决的问题 >

  • 是否可以在比1级更深的级别上进行具有雄辩能力的多级关系查询?我的桌子是这样的: post_comments- 发表评论或回复- 使用者- 用户数据- 所以我想问是不是有可能得到一个帖子的评论与所有的回复和用户数据的人谁回答了评论1查询与雄辩。 这就是我的评论模型的样子: 当我得到一条评论的所有用户数据时,我想得到回复者的所有用户数据。我真的很抱歉,如果这个问题已经在其他地方发布或记录,但我似乎无法

  • 我有点困惑于认识到和包之间的差异。它们实际上通过令牌服务于相同的API身份验证目的吗?只要Laravel Pasport是在5.3中引入的,在最新版本中是否应该使用Pasport而不是包?

  • 我需要关于laravel API的明确信息。 我一直在阅读很多关于 laravel API 的文章。除了在JWT和laravel-passport之间进行选择(这是一个完全不同的混淆程度),我需要获取有关laravelAPI的基本信息,以便让我更清楚地了解什么是什么。 为什么laravel护照需要数据库(这些表的用途是什么) 如果我在authProvider文件中将auth驱动程序更改为passp

  • 拉拉维尔8中的照片没有以html格式显示“替代文本显示”。在Windows文件资源管理器中,我发现每张照片都是一个文件夹,其中包含照片的名称,例如“myphoto.jpg”,此文件夹中有一个“.tmp”文件。目标文件夹是“上传/发布”,当我在浏览器中检查照片时,链接显示正确。这是一张照片的链接示例:“http://localhost/laravel/blog/uploads/posts/16571