我的网站上的搜索功能存在问题,我有2个表:用户和审核,在我的评论表中,所有者列等于用户表中的用户名列,我希望能够以相同的结果返回用户表的用户名并且只是低于我可以获得的评论数量:
import history from './history'
<Router history={history}>...</Router>
xxx 应该等于用户表中的用户名
我必须这样做才能获得用户名:
Review::where('owner', '=', xxx)->where('invitation_id', '')->count();
我想做什么(我知道这是错的):
User::where('username', '=', xxx)->first();
我希望能够在我的result.blade.php中返回这样的搜索结果:
$result = User::where('email','LIKE','%'.$search_key.'%')
->orWhere('username','LIKE','%'.$search_key.'%')
AND
Review::where('username', '=', *$result->username* )
->get();
我检查了Laravel文档,以便在这两个表之间建立关系,但无法弄明白,我希望我所说的是可以理解的。
答案 0 :(得分:1)
您可以使用join和parameter grouping子句
来达到所需的匹配条件$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子句
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();
答案 1 :(得分:1)
你可以使用雄辩的关系。
// 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();
在Review模型中获取->with('users')
条件的用户信息。
答案 2 :(得分:0)
您需要将用户表加入评论表。
这些方面的内容可能需要调整。
$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();