Laravel查询关系模型


Laravel Querying Relationship models

我正在尝试构建类似twitter的东西。当用户发布消息时,链接、提及和标签会链接到特定用户。我使用的是这段代码:

$post = preg_replace('/[@]+([A-Za-z0-9-_]+)/', '<a href="/$1" target="_blank">$0</a>', $post );

例如,如果我发布了"新年快乐@josh#HappyNewYear#2015"。那么帖子中链接的链接将是<a href = "/josh">@josh</a>。但我有这样的路线:

Route::get('/profile{id}', 'UserController@getProfile');

我如何通过找到拥有用户名的用户来更改帖子中的链接。我有两个表usersuser_profile,并且username字段存在于与users具有OneToOne关系的user_profile表中。我用的是哨兵2号包裹。

我还有另一个选择。我可以更改路由以提供配置文件的用户名,但我必须再次找到具有用户名的用户。

当我运行这个:

public function getProfile($username) {
    $user = User::whereIn('username', function($query) {
    $query->select('username')
            ->from('user_profile')
            ->where('username', $username);
        })->get();
}

我得到了这个错误:未定义的变量$username,它还没有声明。当我在url中获取它时。

试着找出这两个问题的答案。谢谢你的帮助。

由于变量作用域,您会得到错误。要在闭包中使用变量,必须将其注入use:

$user = User::whereIn('username', function($query) use ($username) {
    $query->select('username')
        ->from('user_profile')
        ->where('username', $username);
})->get();

然而,如果你有关系,你可以简单地这样做:

$user = User::whereHas('profile', function($q) use ($username){
    $q->where('username', $username);
})->first();