Php Laravel 5.6模型具有3个表之间的许多关系

Php Laravel 5.6模型具有3个表之间的许多关系,php,laravel,laravel-5,Php,Laravel,Laravel 5,如何在3个Laravel表之间建立关系 +---------------+ +---------------+ +-------------------+ | venue_images | | transactions | | image_transaction | +---------------+ +---------------+ +-------------------+ | id | | id | | venue_ima

如何在3个Laravel表之间建立关系

+---------------+  +---------------+  +-------------------+
|  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();

你应该试试这个:

class Transaction extends Model
    {
        public function images(){
            return $this->belongsToMany(ImageTransaction::class ,VenueImage::class, 'transaction_id', 'id');
        }
    }

你应该试试这个:

class Transaction extends Model
    {
        public function images(){
            return $this->belongsToMany(ImageTransaction::class ,VenueImage::class, 'transaction_id', 'id');
        }
    }

hasManyThrough函数的参数顺序看起来是错误的。根据

传递给hasManyThrough方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称

因此,在您的情况下,应该是这样的(不定义外键)

如果这不起作用,请尝试包括文档中描述的钥匙:

执行关系查询时,将使用典型的雄辩外键约定。如果要自定义关系的键,可以将它们作为第三个和第四个参数传递给hasManyThrough方法。第三个参数是中间模型上外键的名称。第四个参数是最终模型上外键的名称。第五个参数是本地键,而第六个参数是中间模型的本地键


hasManyThrough函数的参数顺序看起来是错误的。根据

传递给hasManyThrough方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称

因此,在您的情况下,应该是这样的(不定义外键)

如果这不起作用,请尝试包括文档中描述的钥匙:

执行关系查询时,将使用典型的雄辩外键约定。如果要自定义关系的键,可以将它们作为第三个和第四个参数传递给hasManyThrough方法。第三个参数是中间模型上外键的名称。第四个参数是最终模型上外键的名称。第五个参数是本地键,而第六个参数是中间模型的本地键


如果我没有误解你的问题,你有一个
pivot
image\u事务
,这就是关系。Eloquent自动按字母顺序排列数据透视表的名称,如
transactions\u vention\u image
,因此您需要在参数中传递自定义名称
image\u transaction

在您的VenueImage模型中

public function transactions()
{
    return $this->belongsToMany('App\Transaction','image_transaction');
}
public function venue_images()
{
    return $this->belongsToMany('App\VenueImage','image_transaction');
}
事务中

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();

如果我没有误解你的问题,你有一个
pivot
image\u事务
,这就是关系。Eloquent自动按字母顺序排列数据透视表的名称,如
transactions\u vention\u image
,因此您需要在参数中传递自定义名称
image\u transaction

在您的VenueImage模型中

public function transactions()
{
    return $this->belongsToMany('App\Transaction','image_transaction');
}
public function venue_images()
{
    return $this->belongsToMany('App\VenueImage','image_transaction');
}
在您的交易模型中

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();

@Vincent我已经测试了这段代码,它在类似的情况下工作,用户喜欢一个项目,所以为了得到用户喜欢的项目,我可以按如下方式执行
public function likedProjects(){return$this->hasManyThrough(project::class,like::class,'user\u id',id',id',project\u id');
。在您的例子中,
function images(){return$this->hasManyThrough(VenueImage::class,ImageTransaction::class,'transaction_id','id','id','vention_image_id');}
应该可以。@Vincent我已经测试了这段代码,它在类似的情况下工作,用户喜欢一个项目,所以为了得到用户喜欢的项目,我可以按如下方式执行
公共函数likedProjects(){return$this->hasManyThrough(project::class,like::class,'user\u id',id',id',project\u id');}
。在您的例子中,
function images(){return$this->hasManyThrough(VenueImage::class,ImageTransaction::class,'transaction_id','id','id','Vincement_image_id');}
应该可以使用。@Namoshek这比使用hasManyThrough关系更合适吗?因为下面来自阿德里安·埃尔南德斯·洛佩兹的答案也对我有用。但是什么才是最好的答案呢?@Vincent HasManyThrough的意思是在a有许多B和B有许多C的情况下a和C之间的关系。换句话说,a有许多C到B。对不起,忘了什么。重要的一点是A、B和C是实体(模型),而不是表。数据透视表只是一种技术性的东西,它允许我们有很多关系。它不是一个实体。@Namoshek这比使用hasManyThrough关系更合适吗?因为下面来自阿德里安·埃尔南德斯·洛佩兹的答案也对我有用。但是什么才是最好的答案呢?@Vincent HasManyThrough的意思是在a有许多B和B有许多C的情况下a和C之间的关系。换句话说,a有许多C到B。对不起,忘了什么。重要的一点是A、B和C是实体(模型),而不是表。数据透视表只是一种技术性的东西,它允许我们有很多关系。它不是一个实体。