Laravel 5.5 枢轴连接以获取具有主要 MySQL 结果的枢轴值

Posted

技术标签:

【中文标题】Laravel 5.5 枢轴连接以获取具有主要 MySQL 结果的枢轴值【英文标题】:Laravel 5.5 pivot join to get pivot values with main MySQL result 【发布时间】:2018-03-25 18:18:37 【问题描述】:

我正在尝试在 mysql 查询中加入数据透视表。基本上我是在选择用户,其中一个用户有多个子类别。

所以本质上,对于我的“sub_categories”关系,一个用户有许多子类别。但因为我使用的是 RAW 选择,所以我无法选择/使用关系。相反,我必须使用联接。

这是我的 sub_categories 表

列类型注释 id int(10) 无符号自动增量 main_category_id int(10) 无符号 [0] 类别名称 varchar(100) created_at 时间戳 NULL updated_at 时间戳 NULL

这是我的数据透视表

列类型注释 user_id int(10) 无符号 sub_category_id int(10) 无符号

这是我的 SQL 查询

$users= DB::table('users') ->select('users.*', 'user_options.*', DB::raw(' 分支。*, Professional_profiles.tags, ' . $拉特。 ' 作为 latpoint, ' .美元 . ' 作为长点, ' . $半径。 ' 作为半径, ' . $measurement_number 。 ' 作为距离单位, ( ' . $measurement_number 。 ' * 度数( ACOS( COS(弧度(' . $lat . ')) * COS(弧度(branches.lat)) * COS(RADIANS(' . $lng . ' - 分支.lng)) + 罪(弧度(' . $lat . ')) * 罪(弧度(branches.lat)) ) ) ) 作为距离 '), 'users.id AS id') ->leftJoin('branches', 'users.branch_id', '=', 'branches.id') ->leftJoin('user_options', 'user_options.user_id', '=', 'users.id') ->leftJoin('professional_profiles', 'professional_profiles.user_id', '=', 'users.id') ->where('user_options.professional', '>', 0) ->where('users.branch_id', '>', 0) ->where(函数 ($x) 使用 ($term) $x->where('branches.branch_name', 'like', '%' . $term . '%') ->orWhere('branches.branch_city', 'like', '%' . $term . '%') ->orWhere('users.firstname', 'like', '%' . $term . '%') ->orWhere('users.lastname', 'like', '%' . $term . '%') ->orWhere('professional_profiles.tags', 'like', '%' . $term . '%'); ) ->有('距离','orderBy('距离','asc') ->限制(50) ->获取();

这是我的结果:

[ 编号:4, profile_id: 2, 分支ID:3, 前缀:“博士”, 名字:“SWK1”, 姓氏:“Doe”, 电子邮件:“swk1@gmail.com”, mobile_no: "811692244", 密码:"$2y$10$LzkPwc2TZu/.UzB.0mYJ", 头像: "123.jpg", remember_token: "wF33ShLirtvS3mIYJpmg5skVVoohGJCS7v", created_at: "2017-10-12 09:32:05", 更新时间:“2017-10-12 09:32:05”, 提供者:空, provider_id:空, 用户 ID:4, profile_administrator: 0, 分支管理员:0, 专业:1、 branch_name: "斯瓦科普蒙德 1", branch_address_1: "14 Backer St", 分支地址_2:空, branch_city: "斯瓦科普蒙德", 分支状态:空, branch_zip: "9000", 分支国家:“NA”, 分支电话:“77777”, 主图像:空, 纬度:-22.67, 液化天然气:14.53, 描述:“斯瓦科普蒙德 1”, 标签: "医生,营养师,全科医生", 纬度:“-22.5608807”, 长点:“17.0657549”, 半径:500, 距离单位:“111.045”, 距离:260.210154298872 ]

所以本质上,问题是通过使用数据透视表设置的值,将 sub_categories 表连接到 users 表上,而不依赖 eloquent 关系表,而是使用 SQL。

由于一个用户有许多 sub_categories,最好将 sub_categories 作为连接到主 SQL 查询的数组值返回。

【问题讨论】:

我有完全相同的情况,我使用范围和 with() 方法来获取与用户关联的子类别数组。我会找到我的代码并发布同时你可以看***.com/questions/26178315/… 【参考方案1】:

我有类似的情况,我 Query Scope 连同我的数据透视表一起处理一对多关系。在我的情况下,用户有多个组,我需要在没有额外查询或没有 JOIN 的情况下获取这些数据以及用户对象。 请参阅 Query scope 以及一对多和多对多与 Laravel Doc 的枢轴。

如果您想使用数据透视表获取数据,以下是示例用户模型:

class User extends Authenticatable

    use Notifiable;


    protected $fillable = [
        'name', 'email', 'username', 'password',
    ];


    protected $hidden = [
        'password', 'remember_token',
    ];


    public function groups()
    
        return $this->belongsToMany('App\Group', 'user_groups', 
          'user_id', 'group_id');
    
    public function scopeDetail($query)
    
        return $query->with('groups');
    

组模型:

class Group extends Model

    protected $fillable = [
        'dn', 'cn', 'description',
    ];

在上面的用户模型中,请参阅return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');,其中 user_groups 是我的数据透视表,它定义了用户和组之间的关系。 group_iduser_id 是数据透视表中的字段。

现在使用上述架构获取数据(在控制器上):

User::where(.....)->detail()->first();

其中detail() 是我在用户模型中定义为scopeDetail 的范围。注意:必须附加scope 前缀。这将为您提供用户在数组中所属的所有组,因此每当您以 JSON 格式查看数据时,您都可以以正确的方式查看结构。

使用上述方法,我的 user 对象拥有用户所属的所有组。

额外 如果您的用户模型(用户)也与其他模型相关,那么您可以通过在模型类上定义范围来包含所有这些

............
//..............
    public function profile()
    
        return $this->belongsToMany('App\Profile', 'user_id');
    
    public function data1()
    
        return $this->belongsToMany('App\Data1', 'user_id');
    
    public function groups()
    
        return $this->belongsToMany('App\Group', 'user_groups', 
          'user_id', 'group_id');
    
    //Defining query scope................
    public function scopeDetail($query)
    
        return $query->with('groups','profile','data1');
        //to fetch user with this scope use User::where(.....)->detail()->get(); notice there is not scope prefix while using the scope
    
........
........

【讨论】:

嘿,您的详细回复真是太好了。今天晚上我会试试这个方法并回帖。非常感谢。 变得疯狂 >> 我注意到我忽略了一些本可以为我节省大量时间的事情。哎呀!我会回帖的;) 这是我如何使用查询范围获取属于用户的所有组的示例。始终尝试利用 Laravel 原生功能。如果我可以为您的问题发布代码,请告诉我,但如果您自己解决问题,效果会更好。

以上是关于Laravel 5.5 枢轴连接以获取具有主要 MySQL 结果的枢轴值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 将枢轴附加到具有多个值的表

Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表

试图在 laravel 5.5 中获取非对象的属性

如何在 Laravel 5.5 中将数据插入表格并获取电子邮件通知?

Laravel 枢轴关系

Laravel 5.5 找不到具有正确命名空间的类