繁体   English   中英

使用 eloquent 和 laravel 从多个 sql 表中获取数据

[英]Get data from multiple sql tables using eloquent with laravel

我想达到什么目标?

向用户显示他正在遵循的协议。

我在尝试什么

我设计了两个表,分别是“pacts”和“pacts_follwers”

'pacts'包含所有协议详细信息

表 ' pacts_folwers ' 包含遵循特定协议用户的详细信息

这些链接将为您提供两个表的图像

对于架构参考图像契约表

契约_folwers

那么如何获得用户正在遵循的协议。

我尝试过什么?

查询

SELECT pacts.*, (SELECT pactsid FROM pacts_follwers WHERE pacts.id = pacts_follwers.pactsid
and pacts_follwers.userid = 2 ) as pactID FROM `pacts`

Sql查询结果在此处输入图片说明

此查询将为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM