在这个场景中,您正在构建一个类似 Twitter 的应用程序,您需要在其中显示当前用户的帖子用户正在关注。由于您有三个表,即 Users、Followers 和 Shares,因此了解如何有效地连接它们对于检索所需数据至关重要。
目标是检索 Shares 表中的 user_id 与Followers 表中的 follower_id,并且 Followers 表中的 user_id 与 Users 表中的 id 匹配。
您尝试使用以下查询:
<code class="php">$shares = DB::table('shares') ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id') ->leftjoin('users', 'followers.user_id', '=', 'users.id') ->where('users.id', 3) ->where('shares.user_id', 'followers.follower_id') ->get();</code>
但是,此查询的问题在于分享和关注者的连接条件。正确的连接应该是:
<code class="php">->leftjoin('followers', 'shares.user_id', '=', 'followers.user_id')</code>
建议使用 Laravel 模型来实现更结构化和更高效的数据库操作方法,而不是使用数据库查询构建器.
以下是如何定义模型:
<code class="php">class User extends Model { public function shares() { return $this->hasMany('Share'); } public function followers() { return $this->belongsToMany('User', 'follows', 'user_id', 'follower_id'); } public function followees() { return $this->belongsToMany('User', 'follows', 'follower_id', 'user_id'); } } class Share extends Model { public function user() { return $this->belongsTo('User'); } }</code>
定义模型后,您可以执行如下查询:
<code class="php">$my = User::find('my_id'); // Retrieves all shares by users that I follow // eager loading the "owner" of the share $shares = Share::with('user') ->join('follows', 'follows.user_id', '=', 'shares.user_id') ->where('follows.follower_id', '=', $my->id) ->get('shares.*'); // Notice the shares.* here // prints the username of the person who shared something foreach ($shares as $share) { echo $share->user->username; }</code>
在此示例中,查询检索所有股票,其中 Shares 表中的 user_id 与 Followers 表中的 follower_id 匹配,并且 Followers 表中的 user_id 与 $my 变量中存储的当前用户 ID 匹配。
以上是如何在 Laravel 中高效连接三个表来检索关注用户的帖子?的详细内容。更多信息请关注PHP中文网其他相关文章!