【问题标题】:Laravel 5 nested relationshipLaravel 5嵌套关系
【发布时间】:2015-07-05 15:40:10
【问题描述】:

我有 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(),我不会收到错误消息,但如果用户已经在跟踪产品,我会得到不包含信息的用户对象。

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

【问题讨论】:

  • 对关系使用魔法访问器 ($product->user) 将为您提供该类型的模型,而方法 ($product->user()) 为您提供 Illuminate\Database\Query\Buider 的实例。有方法track() 但模型有。所以$product->user->track() 将允许您使用该方法。甚至$product->user->track 也可以。
  • 你试过了吗? $product->track->user
  • 太棒了。我学到了一些新东西。谢谢。我已经尝试过了,我注意到如果我执行 App\Product::find(1)->user->track 它将带来发布产品的用户添加书签的所有产品。查询午餐是 select * from tracking where tracking.user_id = 4。4 是发布产品的用户 ID。这是第一个问题。其次,如果登录的用户(而不是发布产品的用户)正在跟踪产品,那么我现在想这样做。抱歉,我的问题中的信息不完整。
  • @Alexandros $product->track->user 返回错误:尝试获取非对象的属性

标签: laravel eloquent relationship


【解决方案1】:

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

产品.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();

【讨论】:

  • 它无法正常工作。当我测试 Auth::user()->trackProduct()->where('product_id', '6')->first() 它返回 null,因为形成的查询是这样的:select tracks.*, @ 987654327@.user_id 来自tracks 内部连接productsproducts.id = tracks.product_id 其中products.user_id = '37@ =' 和' 限制 1; Where 子句应以tracks.user_id = "1" 开头,而不是products.user_id ="1"
  • 将 Auth::user() 设置为一个变量,然后像在答案中一样使用 trackProduct 方法
  • 似乎如果在 User.php 中我将关系更改为简单的 hasMany('App\Track') 然后 $user->track()->where('product_id', '6') ->first() 返回正确的结果。但这是正确的做法吗?
  • 是的,它是正确的,我实际上过于复杂了,有时解决方案很简单,但我们很难思考,我要编辑我的答案
  • 谢谢!我对代码的可读性也做了一些改进。我在 User.php 中创建了一个方法,如下所示: public function isTrackingProduct($productId) { if($this->track()->where('product_id', $productId)->first() != null)返回真;否则返回假;现在我可以像这样简单地检查:$user->isTrackingProduct($product->id) 或 App\User::user()->isTrackingProduct($product->id),用于当前登录的用户。跨度>
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 2021-07-19
  • 2019-06-18
  • 1970-01-01
  • 2023-02-20
  • 2021-08-05
  • 2020-11-22
  • 2017-03-02
相关资源
最近更新 更多