如何在Laravel的3个表之间建立关系
+---------------+ +---------------+ +-------------------+
| venue_images | | transactions | | image_transaction |
+---------------+ +---------------+ +-------------------+
| id | | id | | venue_image_id |
| user_id | | user_id | | transaction_id |
+---------------+ +---------------+ +-------------------+
这是我的代码,但是不起作用。
class Transaction extends Model
{
public function images(){
return $this->hasManyThrough(ImageTransaction::class ,VenueImage::class, 'transaction_id', 'id');
}
}
我想使用交易ID和会场图像ID来加入三个表
在我的控制器上
$transactions = transaction::where('user_id', Auth::id())->with('images')->get();
答案 0 :(得分:3)
如果我没有误解您的问题,那么您有一个many-to-many关系的pivot
表image_transaction
。雄辩的表述会像transactions_venue_image
那样按字母顺序自动排列数据透视表的名称,因此您需要在参数中传递自定义名称image_transaction
。 [docs]
在您的 VenueImage 模型中
public function transactions()
{
return $this->belongsToMany('App\Transaction','image_transaction');
}
在您的交易模型中
public function venue_images()
{
return $this->belongsToMany('App\VenueImage','image_transaction');
}
还有第3和第4个参数,它们是相关模型的外键,在文档中有更好的解释。
在您的控制器
中$transactions = transaction::where('user_id', Auth::id())->with('venue_images')->get();
答案 1 :(得分:1)
hasManyThrough函数的参数顺序看起来不正确。根据{{3}}
传递给hasManyThrough方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称。
因此,在您的情况下,应该是这样(不定义外键)
class Transaction extends Model
{
public function images() {
return $this->hasManyThrough(VenueImage::class, ImageTransaction::class);
}
}
如果这样不起作用,请尝试按照文档中的说明包含密钥:
典型的雄辩外键约定将在执行关系的查询时使用。如果您想自定义关系的键,可以将它们作为hasManyThrough方法的第三个和第四个参数传递。第三个参数是中间模型上外键的名称。第四个参数是最终模型上外键的名称。第五个参数是本地键,第六个参数是中间模型的本地键。
答案 2 :(得分:0)
您应该尝试以下操作:
class Transaction extends Model
{
public function images(){
return $this->belongsToMany(ImageTransaction::class ,VenueImage::class, 'transaction_id', 'id');
}
}