Laravel | Искать в 2 таблицах

У меня проблема с моей функцией поиска на моем веб-сайте, у меня есть 2 таблицы: пользователь и обзор. В моей таблице отзывов столбец владельца равен столбцу имени пользователя в таблице пользователей, я хочу иметь возможность вернуться в тот же результат, что и для имени пользователя в пользовательской таблице, и чуть ниже количества отзывов, которое я могу получить:

Review::where('owner', '=', xxx)->where('invitation_id', '')->count();

Ххх должен быть равен имени пользователя в пользовательской таблице
И я должен сделать это, чтобы получить имя пользователя:

User::where('username', '=', xxx)->first();

Что я хотел бы сделать (я знаю, что это неправильно):

$result = User::where('email','LIKE','%'.$search_key.'%')
        ->orWhere('username','LIKE','%'.$search_key.'%')
        AND
        Review::where('username', '=',  *$result->username* )
        ->get();

И я хотел бы иметь возможность возвращать результаты поиска, как это в моем result.blade.php:

<h3>Username: {{ user->username }}</h3>
<h3>Username: {{ review->number_review }}</h3>

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

3 ответа

Вы можете использовать красноречивые отношения.

// app/Review.php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Review extends Model
{

    public function users()
    {
        return $this->hasOne('App\User', 'owner', 'username');
    }
}

Я не предлагаю две таблицы связи с именем пользователя / владельцем. Я предлагаю вам отношения с пользователем primary_id

Вы можете получить информацию о пользователе с помощью следующего кода;

Review::where('owner', '=', xxx)->where('invitation_id', '')->with('users')->count();

Это получение информации о пользователе с ->with('users') Состояние в обзоре модели.

Вы достигаете требуемых критериев соответствия, используя предложение объединения и группировки параметров

$result = DB::table('users as u')
            ->join('review as r', 'u.username', '=', 'r.owner')
            ->where('email','LIKE','%'.$search_key.'%')
            ->orWhere(function ($query) {
                $query->where('u.username','LIKE','%'.$search_key.'%')
                      ->where('r.owner','LIKE','%'.$search_key.'%');
            })
        ->get();

Который будет производить где пункт как

WHERE u.email LIKE '%somevalue%' OR (r.owner LIKE '%somevalue%' AND u.username LIKE '%somevalue%')

Для подсчета отзывов

$result = DB::table('users as u')
            ->select('u.*',DB::raw("COUNT(*) as review_count"))
            ->join('review as r', 'u.username', '=', 'r.owner')
            ->where('u.email','LIKE','%'.$search_key.'%')
            ->orWhere(function ($query) {
                $query->where('u.username','LIKE','%'.$search_key.'%')
                      ->where('r.owner','LIKE','%'.$search_key.'%');
            })
            ->groupBy('u.username')
        ->get();

Вам нужно будет присоединить свою таблицу пользователей к таблице обзора.

Что-то в этом направлении, возможно, потребуется настроить.

$result = User::query()
            ->join('review', 'owner', 'username')
            ->where('email','LIKE','%'.$search_key.'%')
            ->orWhere('username','LIKE','%'.$search_key.'%')
            ->orWhere('username', $result->username)
            ->orWhere('owner', $result->username)
            ->get();
Другие вопросы по тегам