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();