Как использовать «С» в подзапросах, красноречивых с условием? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь добавить новые функции в свой проект, чтобы иметь возможность добавлять твиты анонимно, поэтому мне нужно проверить, если открытое поле = 0, вернуть твиты без пользовательского или нулевого пользовательского объекта!

Как я могу использовать «с» с OrWhere или что-то подобное?

Я сделал это путем объединения коллекций, но для этого мне нужен более эффективный запрос когда я пытаюсь OrWhere () -> with (), который возвращает пользовательские данные для всей коллекции, мне нужны данные в with () приходит только с условием? как это сделать ? Спасибо

$tweets = Tweet::where(function ($query) {
                    $query->where('public',1);
                    $query->where('hashtag_id', request('hashtag_id'));
                })->with([
                    'user' => function ($query) {
                        $query->select('id', 'name', 'username', 'photo', 'verified')->withTrashed();
                    },
                    'hashtag' => function ($query) {
                        $query->withTrashed();
                    },
                  ])->  where(function ($query) {
                        $query->whereRaw('DATE_ADD(created_at,INTERVAL expiration_time SECOND) >= "' . Carbon::now()->toDateTimeString() . '" or expiration_time = 0');})
                        ->withCount(['replies'])->orderBy('created_at', 'desc')->get();
$tweets2 = Tweet::where(function ($query) {
                    $query->where('public',0);
                    $query->where('hashtag_id', request('hashtag_id'));
                })->with(['hashtag' => function ($query) {
                        $query->withTrashed();
                    },
                    ])-> where(function ($query) {
                        $query->whereRaw('DATE_ADD(created_at,INTERVAL expiration_time SECOND) >= "' . Carbon::now()->toDateTimeString() . '" or expiration_time = 0');})
                        ->withCount(['replies'])->orderBy('created_at', 'desc')->get();

$tweets = $tweets->merge($tweets2);           

1 Ответ

0 голосов
/ 05 сентября 2018

Я понял это решение, добавив метод в модель, проверьте это условие, и возврат зависит от этого условия

    $tweets = Tweet::Where(function ($query) {
        $query->where('hashtag_id', request('hashtag_id'));
    })->with([
        'hashtag' => function ($query) {
            $query->withTrashed();
        },
    ])->where(function ($query) {
        $query->whereRaw('DATE_ADD(created_at,INTERVAL expiration_time SECOND) >= "' . Carbon::now()->toDateTimeString() . '" or expiration_time = 0');})
        ->withCount(['replies'])->orderBy('created_at', 'desc')->get();
    foreach($tweets as $tweet){
        $tweet->user = $tweet->GetPublic();
    }

Это метод в модели

public function GetPublic()
    {
        if($this->public == 1)
        {   $user = $this->user;
            return $user;
        }
        else{
            return null;
        }
    }
...