Laravel有一个通过数据透视表

时间:2017-02-03 22:07:39

标签: php laravel eloquent relationship

所以我有2个型号,User&配置文件,关系设置如下:

class's use var x = document.getElementByClass("fromAccount");
name's use var x = document.getElementsByName("fromAccount");
id's use var x = document.getElementsById("fromAccount");

我有3个表,用户,个人资料和user_profiles(数据透视表)

我的用户表中有一个名为 /** * User belongs to many Profile * * @return \Illuminate\Database\Eloquent\Relations\belongsToMany */ public function profiles() { return $this->belongsToMany('App\Models\Profile', 'user_profiles'); } 的列,其中填充了个人资料ID。

如何设置关系以便我可以调用以下内容:

active_profile

这样它将返回active_profile中设置的id的所有配置文件信息?

5 个答案:

答案 0 :(得分:1)

我可能错了,但为什么不使用belongsTo关系?

public function active_profile()
{
    return $this->belongsTo('App\Models\Profile', 'active_profile');
}

希望这有帮助!

答案 1 :(得分:1)

您可以在数据透视表中添加额外的字段,例如active = enum(y, n),然后设置unique key (user_id, active),然后在用户模型中使用wherePivot方法:

public function profiles()
{
  return $this->belongsToMany('App\Models\Profile', 'user_profiles');
}

public function activeProfile()
{
  return $this->belongsToMany('App\Models\Profile', 'user_profiles')->wherePivot('active', 'y');
}

但是它需要数据库重构。

答案 2 :(得分:0)

您应该可以使用find

获取资源
$user->profiles()->find($user->active_profile);

答案 3 :(得分:0)

您可以在User模型中添加方法,如下所示:

public function active_profile ()
{
   return $this->profiles()
          ->find($this->active_profile);
}

然后您可以将该方法称为$ user-> active_profile();

答案 4 :(得分:0)

在Laravel 5.8上,由于我想在紧急加载中使用它,因此我使用了此软件包: https://github.com/staudenmeir/eloquent-has-many-deep

这是我的情况
可以在很多照片上为用户添加标签,而在照片上可以为很多用户添加标签。我想建立关系以获取标记了用户的最新照片。

我认为我的情况也可以应用于任何多对多关系

我做了数据透视模型 UserPhoto

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\Pivot;

class UserPhoto extends Pivot
{

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function photo()
    {
        return $this->belongsTo(Photo::class);
    }

}

然后使用 staudenmeir 的软件包在我的用户模型上:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;

class User extends Model
{
    use HasRelationships;

    public function photos()
    {
        return $this->belongsToMany(Photo::class);
    }

    public function latestPhoto()
    {
        return $this->hasOneDeep(Photo::class, [UserPhoto::class])
            ->latest();
    }
}

然后我可以轻松地执行以下操作:

User::with('latestPhoto')->get()$user->latestPhoto