Laravel 5.6模型具有3个表的多个关系

时间:2018-08-09 09:39:39

标签: php laravel laravel-5

如何在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();

3 个答案:

答案 0 :(得分:3)

如果我没有误解您的问题,那么您有一个many-to-many关系的pivotimage_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');
        }
    }