关于 laravel:Eloquent 查询列表项可见性约束

Eloquent query to list items visibility constraints

我正在为一个 Eloquent 查询而苦苦挣扎。我的最终目标是列出任何人撰写的所有公开帖子,以及给定用户在给定出版物中撰写的私人帖子。

例子:
鉴于这 3 个帖子

标题:标题 1 |用户 ID:1 | is_private: 真

标题:标题 2 |用户 ID:2 | is_private: 假

标题:标题 3 |用户 ID:3 | is_private: 真

userId 1 的输出应该是:

标题 1 和标题 2

我最好的方法是:

1
2
3
4
5
6
    $posts =  Post::WHERE('publication_id', $publicationId)
        ->WHERE('is_private', FALSE)
        ->WHERE(FUNCTION ($query) {
            $query->WHERE('owner_id', auth()->id())
                ->WHERE('is_private', TRUE);
        });

我知道这远远不是我们需要的。


如果第二个 where 语句更改为 orWhere

可能会起作用

1
2
3
4
5
6
$posts = Post::WHERE('publication_id', $publicationId)
    ->WHERE('is_private', FALSE)
    ->orWhere(FUNCTION ($query) {
        $query->WHERE('owner_id', auth()->id)
            ->WHERE('is_private', 'true');
    });

原因是第一个 where 将限制第二个 where 仅搜索公共帖子以检查私人帖子。这不会产生预期的结果。

一切顺利。


你应该试试这个:

1
2
3
4
$posts =  Post::WHERE('publication_id', $publicationId)
                       ->WHERE('is_private', FALSE)
                       ->orWhere('owner_id', auth()->id())
                       ->GET();

试试这个

1
2
3
4
5
$posts =  Post::WHERE('publication_id', $publicationId)
    ->WHERE(FUNCTION ($query) {
        $query->WHERE('is_private', FALSE)
            ->orWhere('owner_id', auth()->id());
    });