Laravel 带条件的Lavarel查询

Laravel 带条件的Lavarel查询,laravel,conditional-statements,relationship,Laravel,Conditional Statements,Relationship,我有一个用户表/模型,其中有一个已批准的列,这是一个布尔值 我有一个Post表/模型,带有用户id外键 Post模型内的关系: 如何列出所有来自approved=true用户的帖子?您可以通过两种方式完成此操作: $users=User::where('approved', true)->get(); foreach ($users as $user) { $posts=Post::where('user_id', $user->id)->get(); } 或者,您

我有一个用户表/模型,其中有一个已批准的列,这是一个布尔值

我有一个Post表/模型,带有用户id外键

Post模型内的关系:


如何列出所有来自approved=true用户的帖子?

您可以通过两种方式完成此操作:

$users=User::where('approved', true)->get();

foreach ($users as $user) {
    $posts=Post::where('user_id', $user->id)->get();
}
或者,您可以使用join

$users=Users::where('approved', true)->join('posts', 'posts.user_id', '=', 
   'users.id')->get();

$posts=Post::join('users', 'users.id', '=', 
   'posts.user_id')->where('users.approved', true)->get();

首先在Post模型中修复关系,将其更改为以下内容:

public function user()
{
    return $this->belongsTo(User::class);
}
您可以阅读更多关于一对多关系的相反内容

然后,您可以使用如下内容:

use Illuminate\Database\Eloquent\Builder;
use App\Post;

$posts = Post::whereHas('user', function (Builder $query) {
    $query->where('approved', 1);
})->get();
这将获得所有有用户且approved列设置为true的帖子


您可以阅读有关Where has的更多信息。

您的帖子模型中是否设置了用户关系?如果是这样,请在你的问题中添加代码。使用laravel的关系实现目标。你可以看到我添加的documenataion@Rwd,我更喜欢第二种方式,但是,有没有一种方式可以为我提供Post而不是User的实例?@user3421985我添加了另一个可以usefull@Hossein第一个解决方案中的$posts变量在每个循环中都会被覆盖,这是如何工作的?这些都是非常简单的关系,我不知道为什么你会使用连接,如果它得到了开箱即用的雄辩支持的话。@Remul-true。您每次都可以将$posts附加到帮助器数组。@Remul@Hossein谢谢你们,我选择了Remul的解决方案,因为它以更简洁的方式返回Post模型所需的实例,而不需要每个实例中的所有用户信息。
use Illuminate\Database\Eloquent\Builder;
use App\Post;

$posts = Post::whereHas('user', function (Builder $query) {
    $query->where('approved', 1);
})->get();