[英]Get data from multiple sql tables using eloquent with laravel
我想达到什么目标?
向用户显示他正在遵循的协议。
我在尝试什么
我设计了两个表,分别是“pacts”和“pacts_follwers”
表'pacts'包含所有协议的详细信息
表 ' pacts_folwers ' 包含遵循特定协议的用户的详细信息。
这些链接将为您提供两个表的图像
那么如何获得用户正在遵循的协议。
我尝试过什么?
查询
SELECT pacts.*, (SELECT pactsid FROM pacts_follwers WHERE pacts.id = pacts_follwers.pactsid
and pacts_follwers.userid = 2 ) as pactID FROM `pacts`
此查询将为 pactId 提供一些值,其中值为 null 表示用户未遵守该协议。 如果这是解决方案,那么我将需要 Eloquent,但我无法做到这一点。
第一桌协议
id
title
about
created_at
updated_at
pactsImage
第二个表pacts_folwers
id
pactsid
userid
created_at
updated_at
控制器代码
$pacts = DB::select("SELECT pacts.*, (SELECT pactsid FROM pacts_follwers WHERE pacts.id =
pacts_follwers.pactsid and pacts_follwers.userid = ".Auth::id()." ) as pactID FROM `pacts`");
您需要为 User 和 Pact 设置hasManyThrough
关系。
class User extends Model {
public function pacts() {
return $this->hasManyThrough(
Pact::class,
PactFollower::class
'userid',
'pactsid'
);
}
}
我不完全理解您是要实现“获取用户的所有协议”还是“如果用户遵循协议”。 无论哪种方式,您都需要设置相关关系。
或者真的很简单(而不是有效的方式)
class Pact extends Model {
public function followers() {
return $this->hasMany(PactFollower::class, 'pactsid')
}
}
现在你可以使用类似的东西
$userIdsForPact = Pact::followers()->pluck('userid');
if ($userIdsForPact->has($user->id)) {
// your operation
}
编辑:对于“如果用户遵循协议”,您需要设置belongsToThrough
关系。 它不是 Laravel 开箱即用的,但staudenmeir/belongs-to-through包应该可以很好地为您服务。
正确设置关系后,您可以使用这样的东西。
Pact::with('user')->get();
或者在你的 Pact 模型中添加一些方法:
public function followedByUser($user) {
return $this->users->has($user);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.