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

只有一个结果的Laravel-belongsToMany关系

房学文
2023-03-14

我在两个表之间有一个关系,其中一个联接表只有一个结果。

当我定义一个Laravel-BelongToMany关系时,我希望它单独返回该项,而不是只返回一个元素的集合。

有没有一种方法可以在Laravel中对此进行建模?

提前感谢。

[编辑]

我将尝试使用经典的用户/角色示例来解释我想要什么。除了deusersroles表之外,我们还有一个users\u rolespivot表,它将存储用户拥有的所有角色。用户在任何给定时间只能有一个活动角色(由active属性true标识)。

class User {
    function role() {
        return $this->belongsToMany('App\Role')->wherePivot('active', 'true');
    }
}

使用此关系定义,当我访问$user-


共有3个答案

亢正德
2023-03-14

就我而言,这是最直接的解决方案

class User extends Model {

    public function services()
    {
        return $this->belongsToMany(Service::class, 'service_user')
                    ->using(ServiceUser::class)
                    ->withPivot('user_id', 'service_id', 'is_main_service');
    }

    public function mainService()
    {
 
        return $this->hasOneThrough(Service::class, ServiceUser::class, 'user_id', 'id', 'id', 'service_id')
                    ->where('is_main_service', 1);
    }
}

数据透视表类:

use Illuminate\Database\Eloquent\Relations\Pivot;

class ServiceUser extends Pivot
{
    
}
狄宜然
2023-03-14

我面对这个问题,并找到了一个真正干净的方法来解决它。

首先,更改返回belongToMany结果的访问器函数的名称,以反映这些函数返回多个结果的事实。在您的情况下,这意味着使用角色而不是角色

function roles() {
  return $this->belongsToMany('App\Role')->wherePivot('active', 'true');
}

然后将以下内容添加到您的模型中:

protected $appends = ['role'];

public function getRoleAttribute() {
  return $this->roles()->first();
}

现在,当您调用$user-

穆乐逸
2023-03-14

如果您只需要一个关系,我不知道为什么您有belongtomany,但是下面的代码将帮助您:

public function products()
{
    return $this->belongsToMany('App\Product');
}

public function specific_product()
{
    return $this->products()
                ->where('column','value')->first();
}

public function getSpecificProductAttribute()
{
    return $this->products()
                ->where('column','value')->first();
}
 类似资料:
  • 我有一个问题,我无法用文档解决。 我想在两个用户之间创建一个非常简单的对话系统。 我有3个模型和表: 用户id、名称 会话 id 消息 id,user_id,conversation_id,内容 因此,一条消息属于一个用户和一个对话,但我希望对话属于多个用户。 我不知道怎么用桌子做这个。如果我在对话表中创建一个字段,我不能有多个用户。。。

  • 我对用户和资源有很多关系。 用户: 资源: 中间表是。与: 我获取资源用户表中用户id所在的所有资源。到现在为止,一直都还不错。但是,即使中间表中不存在用户id,如何获取所有资源条目呢?假设我在资源表中有3个资源。Id 1、2和3。我有一个ID为1的用户。在中间表中,我只有两行: resource_id1和user_id1和值50。 resource_id2和user_id1和值100。 但是我想

  • 我创建了一个自定义的推送()方法,它以级联的方式保存所有模型的关系,并收集实体和子实体详细信息的完整快照用于审计日志。 一切都与belongsTo配合良好,并且有很多关系。我只是这样做: 但问题在于他只有一种关系。它不提供任何方法将相关模型附加到我的根模型而不首先保存它。HasOne关系在Laravel中只有save()方法: 如您所见,它不仅关联,而且保存了模型。为了能够检测字段的所有更改,我的

  • 我有2张表:角色 在用户中,我role_id,我想检查该角色是否在true上有一列“access_admin_area”。如果为真,我正在使用中间件。 从用户模型: SQLSTATE[42703]:未定义的列:7错误:列角色。用户id不存在↵第1行:从“角色”中选择*,其中“角色”。“用户id”=$1和“角色..”。。

  • 问题内容: 根据该文件对中,它说: 以ResultSet对象的形式检索当前结果。每个结果仅应调用此方法一次。 使用一些测试代码,我运行并多次调用,并观察到返回的对象指向同一个对象。因此,我猜测它不会返回您需要单独关闭的其他内容。但是,当然这对于我的JDBC驱动程序可能是唯一的。 纵观文档的,它说: 默认的ResultSet对象是不可更新的,并且具有仅向前移动的光标。因此,您只能迭代一次,并且只能从

  • 我正在与jOOQ通话: 其中应复制此PostreSQL语句: 然而,jOOQ给了我一个只有一个StoreRecord的列表,尽管这里有五个条目符合某些标准。。 我做错了什么?