Laravel模型以获取特定数据段

Laravel模型以获取特定数据段,laravel,Laravel,我正在尝试制作一个函数,它将帮助我快速获取所需的数据 通过所有的试验,我已经能够做到以下几点 表: 用户id、名称 项目id、名称 用户项目id、用户\u id、项目\u id、经理如果经理是布尔值,每个项目只能有一个经理,但是员工仍然可以看到项目原因,为什么我们有一个透视表,其他可以访问该项目的普通用户的经理=0 在项目模型中,我有: public function Manager(){ return $this->belongsToMany('App\User')->

我正在尝试制作一个函数,它将帮助我快速获取所需的数据

通过所有的试验,我已经能够做到以下几点

表:

用户id、名称

项目id、名称

用户项目id、用户\u id、项目\u id、经理如果经理是布尔值,每个项目只能有一个经理,但是员工仍然可以看到项目原因,为什么我们有一个透视表,其他可以访问该项目的普通用户的经理=0

在项目模型中,我有:

  public function Manager(){
    return $this->belongsToMany('App\User')->wherePivot('manager', true);
}
我认为:

 <p><strong>Project Manager:</strong> {{$project->manager}}</p>
当我将视图更改为:

<p><strong>Project Manager:</strong> {{$project->manager[0]->name}}</p>
这是我真正想要的,但如果可能的话,我想从模型上做。所以我试着:

public function Manager(){
    return $this->belongsToMany('App\User')->wherePivot('manager', true)->first()->name;
}
但我得到了以下错误:

must return a relationship instance

这可以通过模型的函数实现吗?

您可以保留定义的关系,但要访问->名字->名字,您需要使用访问器:

public function manager() {
  return $this->belongsToMany('App\User')->wherePivot('manager', true);
}

public function getManagerNameAttribute() {
  return $this->manager->first() ? $this->manager->first()->name : 'No Manager';
}
然后,在您的代码中,您可以简单地访问:

{{ $project->manager_name }}

如果manager函数返回至少包含1条记录的集合,它将返回名称,否则它将显示“No manager”作为回退。

您可以保留定义的关系,但要访问->第一->名称,您需要使用访问器:

public function manager() {
  return $this->belongsToMany('App\User')->wherePivot('manager', true);
}

public function getManagerNameAttribute() {
  return $this->manager->first() ? $this->manager->first()->name : 'No Manager';
}
然后,在您的代码中,您可以简单地访问:

{{ $project->manager_name }}

如果manager函数返回一个至少包含1条记录的集合,它将返回名称,否则它将显示“No manager”作为回退。

如果不想更改此集合的结构,可以使用访问器获取此信息,大致如下所示:

class Project ...
{
    public function users()
    {
        return $this->belongsToMany(...)->withPivot(...);
    }

    public function getManagerAttribute()
    {
        return $this->users()->wherePivot('manager', 1)->first()?->name;
    }
}
您可以通过不同的方式来实现这一点,您可以使用loaded users关系和集合方法来筛选管理器。您可以创建另一个名为managers的关系,该关系使用用户的wherePivot等

此设置唯一需要担心的是,每次调用$model->manager都会导致该查询,因此最好创建另一个关系管理器,以便您可以加载该关系管理器一次并继续使用它,而无需继续查询数据库:

public function managers()
{
    return $this->users()->wherePivot(...);
}

public function getManagerAttribute()
{
    return $this->managers->first()?->name;
}

尽管如此,如前所述,最好在项目本身上有一个类似于经理id的东西。

如果您不想更改此结构,可以使用访问器来获取此信息,大致如下所示:

class Project ...
{
    public function users()
    {
        return $this->belongsToMany(...)->withPivot(...);
    }

    public function getManagerAttribute()
    {
        return $this->users()->wherePivot('manager', 1)->first()?->name;
    }
}
您可以通过不同的方式来实现这一点,您可以使用loaded users关系和集合方法来筛选管理器。您可以创建另一个名为managers的关系,该关系使用用户的wherePivot等

此设置唯一需要担心的是,每次调用$model->manager都会导致该查询,因此最好创建另一个关系管理器,以便您可以加载该关系管理器一次并继续使用它,而无需继续查询数据库:

public function managers()
{
    return $this->users()->wherePivot(...);
}

public function getManagerAttribute()
{
    return $this->managers->first()?->name;
}

尽管如此,如前所述,在项目本身上使用类似于经理id的东西可能更好。

BelongToMany返回一个集合,即多个记录。您的函数名应该是managers,以反映这一点。接下来,如果您的需求是每个项目只能有一个经理,那么为什么要使用返回多个经理的函数和数据库结构?它应该是公共函数管理器{return$this->hasOne…},并且您的项目表应该有一个管理器id,而不是它们之间的透视表。。。您的需求和编码不匹配。您仍然可以使用pivot将用户链接到项目,但请删除“经理”列。因为项目可以有多个用户,但只有一个经理,所以我编辑了问题,感谢您指出。是的,请参阅我编辑的评论;您仍然可以拥有该关系的project_user pivot表,但在我看来,它应该与manager分开。我认为这两种观点都有道理,但有点不合逻辑。我将发布一个关于如何使用您当前结构的答案;1秒belongtomany返回一个集合,即多个记录。您的函数名应该是managers,以反映这一点。接下来,如果您的需求是每个项目只能有一个经理,那么为什么要使用返回多个经理的函数和数据库结构?它应该是公共函数管理器{return$this->hasOne…},并且您的项目表应该有一个管理器id,而不是它们之间的透视表。。。您的需求和编码不匹配。您仍然可以使用pivot将用户链接到项目,但请删除“经理”列。因为项目可以有多个用户,但只有一个经理,所以我编辑了问题,感谢您指出。是的,请参阅我编辑的评论;您仍然可以拥有该关系的project_user pivot表,但在我看来,它应该与manager分开。我认为这两种观点都有道理,但有点不合逻辑。我将发布一个关于如何使用您当前结构的答案;1秒钟。谢谢,它工作得很好。我需要用谷歌搜索访问器的概念来了解它的工作原理:给你:
:Laravel的模型非常神奇,当你深入研究EML时,谢谢你,它工作得非常完美。我需要用谷歌搜索访问器的概念来了解它的工作原理:在这里你可以看到:当你深入研究EML时,Laravel模型非常神奇,这绝对是更干净的。希望是什么?空安全运算符早于PHP8可用:@Timleis yea,我已将所有内容移动到PHP8,现在只能使用它。。。有很多好的功能,巴迪:我希望我能;我读了PHP8的最新消息页面,像圣诞节的孩子一样尖叫,但在我说服管理层采取行动之前,我们还是停留在第7页。但总有一天:只要我有至少7.4,我会非常高兴这绝对是干净的。希望是什么?空安全运算符早于PHP8可用:@Timleis yea,我已将所有内容移动到PHP8,现在只能使用它。。。有很多好的功能,巴迪:我希望我能;我读了PHP8的最新消息页面,像圣诞节的孩子一样尖叫,但在我说服管理层采取行动之前,我们还是停留在第7页。但总有一天:只要我至少有7.4分,我就会非常高兴