在laravel模型中处理关系

时间:2017-01-26 12:58:37

标签: php mysql laravel laravel-5.3

我正在学习Laravel php框架中的关系,我正在尝试构建此查询

SELECT * FROM users u INNER JOIN link_to_stores lts ON u.id=lts.user_id INNER JOIN stores s ON lts.store_id=s.store_id WHERE lts.privilege = 'Owner'

我在Model

中构建了它

Link_to_store.php

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

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

user.php的

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

Store.php

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

我尝试了这个查询,但这只加入了用户和link_to_store表

$personal_stores = Auth::user()->store_links->where('privilege','=','Owner');

现在我也很困惑如何加入商店表。任何人都可以帮忙吗?

架构是这样的

存储表

store_id store_name

用户表

id name

Link_to_stores表

id store_id user_id privilege

2 个答案:

答案 0 :(得分:0)

我认为store_links实际上是一个数据透视表。在这种情况下,您可以使用belongsToMany(),这将自动处理数据透视表。

要执行此操作,请在User模型中将商店功能更改为:

function stores() {
    return $this->belongsToMany('App\Store', 'store_links', 'user_id', 'store_id')->withPivot('privilege');
}

由于stores的主键不是id,因此您必须使用以下行在Store模型中定义此项:

protected $primaryKey = 'store_id';

现在要为用户购买商店,只需拨打

即可
$stores = Auth::user->stores()->wherePivot('privilege', 'Owner')->get();

答案 1 :(得分:0)

  

我正在学习Laravel php框架中的关系,我正在尝试构建此查询

     

SELECT * FROM users u INNER JOIN link_to_stores lts ON u.id=lts.user_id INNER JOIN stores s ON lts.store_id=s.store_id WHERE lts.privilege = 'Owner'

您正在尝试在此处加入。你可以这样做:

$stores = User::join('link_to_stores as lts', 'users.id', '=', 'lts.user_id')->join('stores as s', 'lts.store_id', '=', 's.id')->where('lts.privilege', 'Owner')->get();

但是就像杰罗德夫指出的那样,在你的情况下,似乎多对多关系可能更有意义。不同之处在于关系实际上会执行2个查询(原始模型为1,关系为1)。然后它会将相关模型附加到原始模型(非常方便)。