Laravel 5嵌套关系

Laravel 5嵌套关系,laravel,eloquent,relationship,Laravel,Eloquent,Relationship,我有3张桌子,包括: User: id | name Products: id | name | user_id Tracks: user_id | product_id 这些模型(表)之间的关系如下: 如果用户想要跟踪产品,则使用跟踪表。某种书签 因此,当我在产品页面上时,$product=App\product::find(1),如果我想回显用户名,我会执行$product->user()->name,但如果我想知道用户是否已经跟踪当前产品,当我执行$product->user()->tr

我有3张桌子,包括:

User: id | name
Products: id | name | user_id
Tracks: user_id | product_id
这些模型(表)之间的关系如下:

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

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

Call to undefined method Illuminate\Database\Query\Builder::track()
如果我使用('track')->get()
执行
$product->user()->操作,我不会得到错误,但如果用户已经跟踪产品,我会得到不包含信息的用户对象


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

首先,您的一些关系应该是这样的

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()获取登录用户,因此


使用关系的神奇访问器(
$product->user
)将为您提供该类型的模型,而方法(
$product->user()
)将为您提供
illighted\Database\Query\Buider
的实例。生成器方法没有方法
track()
,但模型有。因此,
$product->user->track()
将允许您使用该方法。甚至
$product->user->track
都可以。你试过了吗<代码>$product->track->user
很好。我学到了一些新东西。谢谢我已经试过了,我注意到如果我使用App\Product::find(1)->user->track,它将带来发布产品的用户标记的所有产品。查询为select*from tracks,其中tracks.user_id=4。4是发布产品的用户id。这是第一个问题。第二个问题是,我现在想知道是否登录的用户(而不是发布产品的用户)正在跟踪产品。抱歉,我的问题中的信息不完整。@Alexandros$product->track->user返回一个错误:试图获取非objectIt的属性无法正常工作。当我测试Auth::user()->trackProduct()->where('product_id',6')->first()时,它返回null,因为形成的查询是这样的:select
tracks
*,
产品
用户id
来自
轨道
内部连接
产品
产品
上轨道产品id其中
产品
用户id=“1”和
产品id
=“6”限制1;Where子句应该以
tracks
user\u id
=“1”开头,而不是以
products
user\u id=“1”开头。将Auth::user()设置为一个变量,然后使用trackProduct方法,如回答中所示。似乎如果在user.php中,我将关系更改为simple hasMany('App\Track'),那么$user->Track()->Where('product\u id','6')->first()正在返回正确的结果。但这是正确的方法吗?是的,这是正确的,我实际上把它复杂化了,有时候解决方案很简单,但我们想得很难,我要编辑我的答案谢谢!我还对代码的可读性做了一些改进。我在User.php中创建了一个类似这样的方法:公共函数isTrackingProduct($productId){if($this->track()->where($productId',$productId)->first()!=null)返回true;否则返回false;}现在我可以简单地检查:$User->isTrackingProduct($product->id)或App\User::User()->isTrackingProduct($product->id),对于当前登录的用户。
$user = App\User::find($id);
$user->track()->where('product_id', $product->id)->first();
$user = Auth::user();
$user->track()->where('product_id', $product->id)->first();