为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 通过具有价值的中间表关联 2 个模型

Laravel 通过具有价值的中间表关联 2 个模型

PHP
慕姐4208626 2022-01-08 20:39:23
我有以下架构                                                                                                                                                                                                                                                                                                                                                                     CREATE TABLE `attributes` (      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,      `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,      `created_at` timestamp NULL DEFAULT NULL,      `updated_at` timestamp NULL DEFAULT NULL,      `deleted_at` timestamp NULL DEFAULT NULL,      PRIMARY KEY (`id`)    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;CREATE TABLE `records` (      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,      `event_school_id` bigint(20) unsigned NOT NULL,      `athlete_id` bigint(20) unsigned NOT NULL,      `year` int(10) unsigned NOT NULL,      `place` int(10) unsigned NOT NULL,      `created_at` timestamp NULL DEFAULT NULL,      `updated_at` timestamp NULL DEFAULT NULL,      `deleted_at` timestamp NULL DEFAULT NULL,      PRIMARY KEY (`id`),      KEY `records_event_school_id_foreign` (`event_school_id`),      KEY `records_athlete_id_foreign` (`athlete_id`),      CONSTRAINT `records_athlete_id_foreign` FOREIGN KEY (`athlete_id`) REFERENCES `athletes` (`id`),      CONSTRAINT `records_event_school_id_foreign` FOREIGN KEY (`event_school_id`) REFERENCES `event_school` (`id`)    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;如何在 laravel 中正确设置模型?对于attribute_record 表,属性和记录之间的关系中存在一个值。我想知道是否需要attribute_record 表的模型。
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

我想知道是否需要attribute_record 表的模型。


不,这是一个数据透视表,当你正确设置关系时,Laravel 会透明地使用它。我假设这是一个多对多的关系(记录可以有很多属性,很多记录可以有相同的属性)所以定义你的关系,剩下的由 Laravel 完成:


<?php


namespace App;


use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\SoftDeletes;

class Attribute extends Model

{

    use SoftDeletes;

    protected $guarded = ['id'];

    public function records()

    {

        return $this->belongsToMany('\\App\\Record')

            ->withPivot('value')

            ->withTimestamps();

    }

}



<?php


namespace App;


use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\SoftDeletes;

class Record extends Model

{

    use SoftDeletes;

    protected $guarded = ['id'];

    public function attributes()

    {

        return $this->belongsToMany('\\App\\Attributes')

            ->withPivot('value')

            ->withTimestamps();

    }

}

现在在控制器中你可以这样做:


$record = \App\Record::find($id);

foreach ($record->attributes as $attribute) {

    // $attribute is an instance of \App\Attribute

    // to access the values in the pivot table, use the pivot attribute

    echo $attribute->pivot->value;

}


查看完整回答
反对 回复 2022-01-08
?
萧十郎

TA贡献1815条经验 获得超13个赞

<?php


namespace App;


use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\SoftDeletes;

class Record extends Model

{

    use SoftDeletes;

    protected $guarded = ['id'];


    public function attributes()

    {

        return $this->belongsToMany(Attribute::class, 'attribute_record')

            ->withPivot('value');

    }

}

然后你可以访问这样的值:


foreach($record->attributes as $attribute) {

    echo $attribute->pivot->value;

}

当您使用withPivot方法指定值时,您可以在 下访问它们$relatedInstance->pivot->yourColumn。


枢轴值是从中间关系表中检索的(attribute_record在您的示例中)


查看完整回答
反对 回复 2022-01-08
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信