如何将Eloquent与其他表格映射?

时间:2014-05-30 12:26:36

标签: orm laravel eloquent

这是我第一次使用ORM,所以我想知道是否可以将它映射到其他表...

例如我目前已登录用户。它通过链接表连接到POSTS表。例如,如果我想选择帖子我做这样的SQL:

SELECT
    `posts`.`id`', `posts`.`Name`, `posts`.`Description`
FROM
    `links`,
    `posts`
WHERE
    `links`.`user_id` = 1 AND `links`.`post_id` = `posts`.`id`

如何扩展Eloquent如果我请求Posts::all()它将只返回当前用户的帖子...

2 个答案:

答案 0 :(得分:2)

您的帖子有点令人困惑,但我希望我的回答可以按照您的预期解决。

警告:

有关详情,请参阅Laravel(多对多)Relationship documentation

为了简单起见并遵守 Laravel惯例,我强烈建议您使用post_user代替link作为数据透视表post_user表格应以user_idpost_id作为列。)

您不必定义相应的枢轴模型(这是惯例)。

以下模型旨在尊重表格usersposts

用户模型:

app / model / user.php中的

(已经存在,只需添加关系定义)

class User extends Eloquent {

    ...

    public function posts()
    {
        return $this->belongsToMany('Post');
    }

    ...

}

发布模型:

在app / models / post.php中

(当然要创建)。

...

class Post extends Eloquent {

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

}

...

检索用户的帖子:

通常,您在Laravel中执行以下操作以获取当前登录的用户:

$user = Auth::user(); // a User model / record

假设$ user的类型为User(Model),您可以使用以下命令检索其所有帖子:

$user->posts(); // a Collection

答案 1 :(得分:2)

您可以在POST模式中定义query scope

public function scopeOfUser($query,$user_id)
{
    return $query->join('links', 'links.post_id', '=', 'posts.id')
       ->where('links.user_id', '=', $user_id)
       ->select('posts.id', 'posts.Name', 'posts.Description');
}

然后像这样使用它:

$posts = POST::OfUser(1)->get();