Laravel 5嵌套关系

时间:2015-07-05 15:40:11

标签: laravel eloquent relationship

我有3张桌子,其中包含:

User: id | name
Products: id | name | user_id
Tracks: user_id | product_id

这些模型(表格)之间的关系是:

//User.php*************************************************
public function products() {
    return $this->hasMany('App\Product');
}
public function track() {
    return $this->hasMany('App\Track');
}


//Product.php*************************************************
public function user() {
    return $this->belongsTo('App\User');
}
public function track() {
    return $this->belongsTo('App\Track');
}


//Track.php*************************************************
 public function products() {
    return $this->hasMany('App\Product');
}

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

如果用户想要跟踪产品,则使用跟踪表。某种书签。

因此,当我在产品页$product = App\Product::find(1)上时,如果我想回显用户名,我会$product->user()->name,但如果我想知道用户是否已经跟踪了当前产品,当我$product->user()->track()->get()时,我收到此错误:

Call to undefined method Illuminate\Database\Query\Builder::track()

如果我$product->user()->with('track')->get(),我没有收到错误,但如果用户已经在跟踪产品,我会收到用户对象,但不包含信息。

我如何知道用户是否已在跟踪产品?

1 个答案:

答案 0 :(得分:0)

首先,你的一些关系应该像这些

Product.php

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

Track.php

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

现在检查用户是否正在跟踪产品

$product = App\Product::find($id);
$product->user->track()->where('product_id', $product->id)->first();

另一种方式

$user = App\User::find($id);
$user->track()->where('product_id', $product->id)->first();

要检查登录用户是否正在跟踪产品,您可以通过Auth :: user()获取登录用户,所以

$user = Auth::user();
$user->track()->where('product_id', $product->id)->first();