Laravel 使用数据透视表选择记录

Posted

技术标签:

【中文标题】Laravel 使用数据透视表选择记录【英文标题】:Laravel select records with pivot table 【发布时间】:2020-08-19 09:42:11 【问题描述】:

我的口才有点问题。我有 3 张桌子。 Usersphrasesphrase_user。 短语用户包含列:id, phrase_id, user_id 例如,我需要选择带有数据透视表的短语。 此操作与 SQL 将是这样的......

SELECT phrase FROM phrases 
LEFT JOIN phrase_user ON  phrases.id = phrase_user.phrase_id
LEFT JOIN users ON phrase_user.user_id = $userId

这是我在控制器中的索引函数

$phrases = DB::table('phrases')->orderBy('id','desc')->Paginate(5);
$user = Auth::user(); 
       
return view('pages.phrases.index')->with(['phrases' => $phrases, 'user' => $user]);

我也在模型中编写了这些函数... 短语模型:

public function users()

    return $this->belongsToMany('App\User')->withTimestamps();

用户模型:

public function phrases()

    return $this->belongsToMany('App\Phrase')->withTimestamps();

在这种情况下,分页器无法正常工作,因为$phrases = DB::table('phrases')->orderBy('id','desc')->Paginate(5); 有一些问题..

总结:我只需要在短语页面中显示我的短语。每个用户都必须有他们的短语。

【问题讨论】:

我想你可以这样做$user->phrases()->>orderBy('id','desc')->paginate()你以前试过这样做吗? 在这种情况下如何调用分页?而不是 $phrases->links() 这个? @lukatatrishvili 你不需要打电话给links()。如果您希望分页中的项目没有所有分页额外属性,那么您应该能够将其发送到您的视图$phrases >items();这只是项目的数组。 非常感谢。你真的帮了我... 【参考方案1】:
$userId = 2;

$phrases = DB::table('phrases')->whereHas('users', function ($q) use ($userId) 
    $q->whereId($userId);
)->orderBy('id','desc')->Paginate(5);

$user = Auth::user();

return view('pages.phrases.index')->with(['phrases' => $phrases, 'user' => $user]);

【讨论】:

【参考方案2】:

尝试使用小写分页

$phrases = DB::table('phrases')->orderBy('id','desc')->paginate(5);

【讨论】:

以上是关于Laravel 使用数据透视表选择记录的主要内容,如果未能解决你的问题,请参考以下文章

在另一个表 Laravel 中查找具有数据透视表中所有 id 的记录

在laravel中将数据插入数据透视表

Laravel - 使用复选框将数据发送到数据透视表

Laravel 与数据透视表的关系,关系?

Laravel 5 - 从数据透视表额外属性获取属性

与laravel 4中的数据透视表存储关系