【问题标题】:laravel one-to-many get data without inner joinlaravel 一对多获取数据,无需内部连接
【发布时间】:2015-04-26 11:07:49
【问题描述】:

我正在尝试了解 laravel ORM,我有以下模型。

我有一个: 带有 id、firstname、lastname 的用户表 带有 - id、name 的城市表 带有 - user_id, city_id 的 usercity 表

usercity 表跟踪用户访问过的城市。

我在城市模型中添加了以下内容:

    public function usercity()
    {
            return $this->hasMany('App\UserCity');
    }

以及用户模型中的另一个功能

    public function usercity()
    {
            return $this->hasMany('App\UserCity');
    }

我还为 UserCity 添加了一个模型,并在那里添加了以下功能。

    public function city()
    {
            return $this->belongsTo('App\City');
    }
    public function user()
    {
            return $this->belongsTo('App\User');
    }

现在,目标是检索用户访问过的所有城市。我使用了以下功能。

   $usercities = User::where('id','=',1)->first()->usercity()->get();

这在它检索 user_id 和 city_id 的意义上是有效的。 我还需要做什么才能获得城市表中的所有字段? 当前响应:

[[{"user_id":"1","city_id":"1"},{"user_id":"1","city_id":"2"},{"user_id":"1","city_id":"3"},{"user_id":"1","city_id":"4"}]]

我也许可以使用内部联接,但我想看看是否有另一种方法可以检索数据,从而为我安全地填充数据。

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    您真正拥有的是用户和城市之间的多对多关系,其中 usercity 表是数据透视表。 Laravel 使用 BelongsToMany 关系来实现这一点。您需要进行一些更改才能使其正常工作。

    在您的城市模型中:

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

    在您的用户模型中:

    public function cities() {
        return $this->belongsToMany('App\City', 'usercity');
    }
    

    您可以摆脱 UserCity 模型。通常没有理由需要数据透视表的模型。

    可能需要更新 usercity 表以添加 id 字段作为主键。但是,我没有尝试过没有它,所以它可能会像你一样工作。此外,如果您愿意,您可以将表重命名为 city_user 以符合 Laravel 约定,然后您无需在关系定义中指定表名。

    正确设置关系后,您可以通过用户上的城市关系访问用户的城市,也可以通过城市上的用户关系访问城市的用户。例如:

    // all of the cities visited by user 1
    $user = User::find(1);
    $usercities = $user->cities;
    
    // all of the users that have visited city 1
    $city = City::find(1);
    $cityusers = $city->users;
    

    您可以在文档here 中找到有关这些关系的更多信息。

    【讨论】:

    • 您好,我尝试了您的建议,发现有问题。 usercities 的内部连接发生在“id”列而不是“user_id”列上。我看到以下内部连接:选择cities.*,usercities.city_id from cities inner join usercities on usercities.id = cities.id@4.3@9876543 city_id = 1)'
    • @user1647708 你能展示你的新关系和测试代码吗?对于 belongsToMany 关系,该查询是非常错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多