在Laravel中找到具有用户名的用户?

时间:2019-11-22 12:40:44

标签: php laravel laravel-5

其中有两个关系表User和Profile,用户名存储在Profile中。 我在路由中传递用户名,并使用此代码获取用户,但显示错误

错误

  

“ Symfony \ Component \ Debug \ Exception \ FatalThrowableError:调用   成员函数profile()在文件“”中为null。

此代码有什么问题,请检查!

public function update(Request $request, $user)
{
    $user = User::find(1)->profile()->where('username', $user);

    $user->update([
        'name' => $request->name,
        'email' => $request->email
    ]);

    // A User has a profile
    $user->profile()->update([
        'username' => $request->username,
        'location' => $request->location,
        'languages' => $request->languages,
        'about' => $request->about,
        'skills' => $request->skills,
        'available_for' => $request->available_for

    ]);

    return [
        'status' => true,
        'message' => 'User and profile updated',
    ];
}

2 个答案:

答案 0 :(得分:2)

使用find将通过其主键搜索模型以找到给定的ID(就像您搜索用户ID 1)。如果要使用其他属性进行查找,则必须使用where函数,而如果只希望使用第一个函数,请使用first

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

$user = User::where('username', $user)->profile()->first();

答案 1 :(得分:2)

您的查询没有多大意义,您从数据库中获取ID为1的用户,然后在其个人资料中搜索username,除非您返回null很幸运,并且ID为1的用户具有给定的username

您可以使用以下内容:

use Illuminate\Database\Eloquent\Builder;

public function update(Request $request, $username)
{
    $user = User::whereHas('profile', function (Builder $query) use ($username) {
        $query->where('username', $username);
    })->firstOrFail();

    ...
}

它将在配置文件表中搜索具有给定用户名的用户,如果找不到用户,则会抛出异常。

来自docs

  

如果您需要更大的功能,可以使用whereHas和orWhereHas方法在您的has查询中添加“ where”条件。   这些方法使您可以将自定义约束添加到   关系约束,例如检查评论内容:

use Illuminate\Database\Eloquent\Builder;

// Retrieve posts with at least one comment containing words like foo%...
$posts = App\Post::whereHas('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
})->get();