我试图在MySQL查询上加入数据透视表。基本上我选择用户,其中一个用户有多个子类别。
因此,基本上与我的" sub_categories关系,一个用户有许多子类别。但因为我使用RAW选择,我无法选择/使用关系。相反,我必须使用连接。
这是我的sub_categories表
Column Type Comment id int(10) unsigned Auto Increment main_category_id int(10) unsigned [0] category_name varchar(100) created_at timestamp NULL updated_at timestamp NULL
这是我的数据透视表
Column Type Comment user_id int(10) unsigned sub_category_id int(10) unsigned
这是我的SQL查询
$users= DB::table('users') ->select('users.*', 'user_options.*', DB::raw(' branches.*, professional_profiles.tags, ' . $lat . ' AS latpoint, ' . $lng . ' AS longpoint, ' . $radius . ' AS radius, ' . $measurement_number . ' AS distance_unit, ( ' . $measurement_number . ' * DEGREES( ACOS( COS(RADIANS(' . $lat . ')) * COS(RADIANS(branches.lat)) * COS(RADIANS(' . $lng . ' - branches.lng)) + SIN(RADIANS(' . $lat . ')) * SIN(RADIANS(branches.lat)) ) ) ) AS distance '), '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(function ($x) use ($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 . '%'); }) ->having('distance', 'orderBy('distance', 'asc') ->limit(50) ->get();
这是我的结果:
[ { id: 4, profile_id: 2, branch_id: 3, prefix: "dr", firstname: "SWK1", lastname: "Doe", email: "swk1@gmail.com", mobile_no: "811692244", password: "$2y$10$LzkPwc2TZu/.UzB.0mYJ", avatar: "123.jpg", remember_token: "wF33ShLirtvS3mIYJpmg5skVVoohGJCS7v", created_at: "2017-10-12 09:32:05", updated_at: "2017-10-12 09:32:05", provider: null, provider_id: null, user_id: 4, profile_administrator: 0, branch_administrator: 0, professional: 1, branch_name: "Swakopmund 1", branch_address_1: "14 Backer St", branch_address_2: null, branch_city: "Swakopmund", branch_state: null, branch_zip: "9000", branch_country: "NA", branch_phone: "77777", main_image: null, lat: -22.67, lng: 14.53, description: "Swakopmund 1", tags: "Doctors,Dietician,General Practitioner", latpoint: "-22.5608807", longpoint: "17.0657549", radius: 500, distance_unit: "111.045", distance: 260.210154298872 } ]
所以基本上问题是通过使用数据透视表设置的值来加入users表上的sub_categories表,而不依赖于eloquent relationships表而是使用SQL。
由于一个用户有很多sub_categories,,将sub_categories作为在主SQL查询上加入的数组值返回会很棒。
答案 0 :(得分:1)
我有类似的情况和我Query Scope以及我的数据透视表,用于一对多的关系。在我的情况下,用户有多个组,我需要获取这些数据以及用户对象,无需额外的查询或没有JOIN。
使用Laravel Doc上的透视图,查看Query scope
和一对多以及多对多。
如果你想使用枢轴表获取数据,这里是示例
用户模型:
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_id
和user_id
是pivotote表中的字段。
现在使用上面的architechture获取数据(在控制器上):
User::where(.....)->detail()->first();
其中detail()
是我在用户模型中定义的范围scopeDetail
。注意:必须附加scope
前缀。这将为用户提供数组中用户所属的所有组,因此每当您使用JSON查看数据时,您都可以正确地看到结构。
使用上述方法,我的用户对象包含用户所属的所有群组。
<强>附加强>
如果您的用户模型(用户)也与其他模型相关,那么您可以通过将模型类的范围定义为
............
//..............
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
}
........
........