其中有两个关系表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',
];
}
答案 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();