【问题标题】:How to get searched data from second model through first one in Laravel?如何通过 Laravel 中的第一个模型从第二个模型中获取搜索数据?
【发布时间】:2020-09-13 08:57:36
【问题描述】:

具有 (id | user_id | name) 列的 Profile 模型的用户关系为:

    public function user(){
        return $this->belongsTo(User::class);
    }

用户模型的技能关系为:

  public function skills()
  {
    return $this->belongsToMany(Skill::class);
  }

数据透视表是具有 user_id | 的 Skill_user Skill_id 列和 Skill 模型用户关系为:

    public function users(){
        return $this->belongsToMany(User::class);
    }

如何从搜索请求中搜索具有特定技能的个人资料。

$profiles = Profile::with('users')->where('name', 'like', ''.$term.'%')->get();

但我收到了 not profile_skill 表的错误!

我可以通过

访问每个具有特定技能的个人资料
$profile->user->skills

但是我如何从以下方面获得这些技能:

<input name="term" type="text" />

我在 Profile 模型中测试了用户关系,但出现错误:

    public function users(){
        return $this->hasManyThrough(User::class, Skill::class, 'skill_id', 'user_id');
    }

【问题讨论】:

    标签: laravel


    【解决方案1】:

    另外,你可能想试试whereHas,我相信是最简单的:

    return Profile::whereHas('user.skills', function ($query) use ($term) {
        $query->where('name', 'like', "{$term}%");
    })
    ->get();
    

    【讨论】:

    • 嗨凯文,谢谢,我的问题只是 ('user.skills) 模式,我还找到了一个更简短的答案:return Profile::whereHas('user.skills', function (Builder $query ) { $query->where('name', 'like', "{$term}%"); })->get();
    【解决方案2】:

    有两种方法可以做到这一点。第一个是使用预先加载的关系并过滤结果集合。以这种方式,代码更直接,但效率较低。这将检查 EXACT 匹配,没有 LIKE 查询。如果您需要 LIKE,请参考选项 2。

    $profiles = Profile::with('user.skills')->get();
    
    $profilesWithSkill = $profiles->filter(function ($profile, $key) use($term) {
        return $profile->user->skills->contains('name', $term);
    });
    
    

    第二种方法是使用查询构建器和连接。这应该更快,但将返回关联数组而不是模型实例。您可以为您需要的字段自定义select

    DB::table('profiles')
        -> join('skill_user', 'skill_user.user_id', '=', 'profiles.user_id')
        -> join('skills', 'skills.id', '=', 'skill_user.skill_id')
        -> where('skills.name', 'like', ''.$term.'%')
        -> select('profiles.*')
        -> get();
    

    这在很大程度上取决于您应该选择哪一个用例,当您获得大量数据时,这一点非常重要。

    【讨论】:

    • 感谢您的回答我从正式文档中学到了一些新东西,但我收到一个错误:调用未定义的方法 Illuminate\Database\Eloquent\Builder:: filter() 和第二种方法发送错误:未找到列:1054 'on 子句'中的未知列'=skill_user.skill_id'。
    • 谢谢,我忘记添加 get() 调用,不小心放了一个点而不是逗号。我编辑了答案。我还在我自己的多对多关系上测试了这两种方法,它做得很好。让我知道它现在是否适合您。
    • 在这两种方法中,都无法让 Profile 数据显示在 @foreach($profiles as $profile) .... 并且没有结果!
    • 我提供的查询是为了完全匹配,我看到您使用的是带有 % 运算符的 like。使用查询生成器对第二个选项进行最后一次更新,如果它不起作用,我将删除我的答案。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2017-05-23
    • 1970-01-01
    • 2016-11-03
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多