【问题标题】:Laravel 5.4 table relationship between 3 small tablesLaravel 5.4 3个小表之间的表关系
【发布时间】:2018-03-08 01:31:27
【问题描述】:

我最近开始学习 Laravel 5.4,我的 3 向表关系有问题,我在网上看了一些关于多对多的文章,但这种关系只是双方的“hasOne”。

谁能给我一个关于如何构建我的表关系的有用提示,这里是 PK/FK 关系:

Users table     (id)

Listings table  (id, user_id)

Insights table  (id, listing_id) - one insight row per listing only.

以及以下型号:

用户模型

class User extends Model
{
    public function listing()
    {
        return $this->belongsTo('App\Listing');
    }
}

上市模式

class Listing extends Model
{
    public function insight()
    {
        return $this->hasOne('App\Insight');
    }    
}

洞察模型

class Insight extends Model
{
    public function listing()
    {
        return $this->hasOne('App\Listing');
    }    
}

我想要实现的是查询用户自己的列表,每个列表都是当前的见解。

非常感谢。

西蒙。

【问题讨论】:

  • 你的意思是,1 个用户有 1 个列表,其中有 1 个见解?
  • 嗨@aleksandrs,谢谢,用户可以有很多列表,但列表只有一个见解

标签: laravel eloquent


【解决方案1】:

用户模型

class User extends Model
{
    public function listing()
    {
        return $this->hasOne('App\Listing');
    }
}

上市模式

class Listing extends Model
{
    public function insight()
    {
        return $this->hasOne('App\Insight');
    } 

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

洞察模型

class Insight extends Model
{
    public function listing()
    {
        return $this->belongsTo('App\Listing');
    }    
}

如果您想使用列表和洞察力查询用户

$users = User::with(['listing', 'listing.insight'])->get();

foreach($users as $user) {
    $user->listing->insight;
}

【讨论】:

  • 感谢 @Morteza Rajabi 的帮助,我正在尝试实现您列出的查询,但是通过用户 ID,如果我们假设 user_id 为 1,我是否可以将其包含在查询中好吗?
  • 使用 'find($id)' 代替如果 'get()' 是一个用户并且不需要 foreach
  • @MortezaRajabi 我认为@SimonEl 说一个用户可以有很多列表。而且我认为这里没有必要查询两次$users = User::with(['listing', 'listing.insight'])->get();。你可以使用$users = User::with('listing.insight')->get();得到你想要的。
  • @MortezaRajabi 非常感谢您的帮助。 Ako 对许多列表的看法是正确的,抱歉不够清楚。您的回答帮助我完善了结果。 [
【解决方案2】:
class User extends Model
{
    public function listing()
    {
        return $this->hasMany(Listing::class);
    }
}

class Listing extends Model
{
    public function insight()
    {
        return $this->hasOne(Insight::class);
    } 

    public function user()
    {
        return $this->belongsTo(User::class);
    }    
}

class Insight extends Model
{
    public function listing()
    {
        return $this->belongsTo(Listing::class);
    }    
}

$users = User::with('listing.insight')->get();

foreach($users as $user) {
    $user->listing->insight;
}

【讨论】:

  • 非常感谢,修改关系并使用 User::with(['listing.insight'])->find($user_id);完美运行。
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多