Laravel Eloquent получает связанный контент с несколькими столбцами - PullRequest
0 голосов
/ 04 июня 2018

В моем приложении я пытаюсь создать связанный раздел «События», в котором отображаются все события, связанные с определенным событием.

У меня был этот запрос

public function show($id)
{
    // The current event
    $event = Event::find($id);

    // Find related, upcoming events
    $tags = $event->tags;

    $relatedEvents = Event::where('startDate', '>=', Carbon::now())
    ->where(function ($query) use ($event) {
        $query->where('hostedBy', $event->hostedBy);
        $query->orWhere('type', $event->hostedBy);
        $query->orWhere('category', $event->hostedBy);
        $query->orWhere('sector', $event->hostedBy);
    })
    ->toSql();

    dd($relatedEvents);
}

Какой вывод он следует за SQL

"select * from события where startDate >= ? and ( hostedBy = ? or тип = ? or категория = ? or сектор = ?)"

Затем я попробовал это

/**
 * Display the specified resource.
 *
 * @param  \App\Event  $event
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    // The current event
    $event = Event::find($id);

    // Find related, upcoming events
    $tags = $event->tags;

    $relatedEvents = Event::where('startDate', '>=', Carbon::now())
    ->where(function ($query) use ($event) {
        $query->where('hostedBy', $event->hostedBy);
        $query->orWhere('type', $event->hostedBy);
        $query->orWhere('category', $event->hostedBy);
        $query->orWhere('sector', $event->hostedBy);
        $query->orWhereHas('tags', function ($query) use ($tags) {
            $query->where('slug', $tags->slug);
        });
    })
    ->toSql();

    dd($relatedEvents);
}

Но с этой попыткой я получил неопределенную переменную $tags

У вас может быть много вложенных запросов?

Это потому, что мне нужно было проверить поля, но также нужно сравнить теги, заданные для события.

Кроме того, что мне делать, если в текущей статье вообще нет тегов?

Обновление

public function show($id)
{
    // The current event
    $event = Event::find($id);

    // Find related, upcoming events
    $tags = $event->tags;

    $relatedEvents = Event::where('startDate', '>=', Carbon::now())
    ->where(function ($query) use ($event, $tags) {
        $query->where('hostedBy', $event->hostedBy);
        $query->orWhere('type', $event->type);
        $query->orWhere('category', $event->category);
        $query->orWhere('sector', $event->sector);
        $query->orWhereHas('tags', function ($query) use ($tags) {
            foreach ($tags as $tag) {
                $query->where('slug', $tag->slug);
            }
        });
    })
    ->orderBy('startDate', 'dsc')
    ->toSql();

    dd($relatedEvents);
}

Мне нужно проверить это, но, поскольку может быть несколько тегов, я прошел через них.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Попробуй это.При первом использовании необходимо передать переменную $ tags

 $relatedEvents = Event::where('startDate', '>=', Carbon::now())
    ->where(function ($query) use ($event, $tags) {
        $query->where('hostedBy', $event->hostedBy);
        $query->orWhere('type', $event->hostedBy);
        $query->orWhere('category', $event->hostedBy);
        $query->orWhere('sector', $event->hostedBy);
        $query->orWhereHas('tags', function ($query) use ($tags) {
            $query->where('slug', $tags->slug);
        });
    })
    ->toSql();
0 голосов
/ 04 июня 2018
$query->orWhereHas('tags', function ($q) use ($tags) {
        $q->where('slug', $tags->slug);
    });

какие отношения вы определили между событием и тегами.Я думаю, что их много, поэтому в этом случае вы должны использовать $ q-> whereIn ('slug', $ tags-> slug);

в противном случае

илиWhereHas ('tags');достаточно.

0 голосов
/ 04 июня 2018

Pass tags от первого, где

$relatedEvents = Event::where('startDate', '>=', Carbon::now())
    ->where(function ($query) use ($event, $tags) { // add tags here
        $query->where('hostedBy', $event->hostedBy);
        $query->orWhere('type', $event->hostedBy);
        $query->orWhere('category', $event->hostedBy);
        $query->orWhere('sector', $event->hostedBy);
        $query->orWhereHas('tags', function ($query) use ($tags) {
            $query->where('slug', $tags->slug);
        });
    })
    ->toSql();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...