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

尝试使用 attach() 填充中间表

尝试使用 attach() 填充中间表

PHP
梵蒂冈之花 2021-06-15 09:26:09
我有名为users,places和 的表user_place。users有一个名为的列id,其中包含用户的 ID,场所也有一个名为的列place_id。该user_place表有 2 列被调用user_id,place_id我试图用相应的 id 自动填充它们。我读到我必须在建立关系后使用 attach() 函数,我相信我已经完成了,但我可能是错的。他们来了:class PlaceController extends Controller{    public function likePlace(Request $request){        $placeId = $request['placeId'];        $userId = $request['userId'];        $user = User::where('id', $userId)->first();        $place = new Place();        $place->place_id = $placeId;        $place->save();        $user->places()->attach($place);    }}用户模型:class User extends \Eloquent implements Authenticatable{    use AuthenticableTrait;    public function places(){        return $this->hasMany('App\Place');    }}放置模式:class Place extends Model{    public function user(){        return $this->belongsToMany('App\User');    }}
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

在多对多关系中,您应该定义两个关系,如下所示:


用户名


class User extends \Eloquent implements Authenticatable

{

    use AuthenticableTrait;


    public function places()

    {

        return $this->belongsToMany('App\Place', 'user_place', 'user_id', 'place_id');

    }   //                                       ^^^^^^^^^^^^

}

注意:鉴于您的中间表名称不遵循我们指定的命名约定,因此 Laravel 知道要查找表的位置。


地方.php


请注意,您提到您的 Place 模型的主键是place_id,这也与Laravel 约定不同,您应该指定它:


protected $primaryKey = 'place_id'; // <----


class Place extends Model

{

    public function user()

    {

        return $this->belongsToMany('App\User', 'user_place', 'place_id', 'user_id');

    }

}

所以现在在你的控制器中:


class PlaceController extends Controller

{

    public function likePlace(Request $request)

    {

        $placeId = $request['placeId'];

        $userId = $request['userId'];


        $user = User::where('id', $userId)->first();


        $place = new Place();

        $place->place_id = $placeId;

        $place->save();


        $user->places()->attach($place);

    }

}

边注

正如我所指出的,您可以节省几行用等效的句子替换一些句子:


    $userId = $request['userId'];

    $user = User::where('id', $userId)->first();

使用find()方法,这等于:


    $user = User::find($request['userId']);

然后,您可以使用createEloquent 模型的静态方法创建相关对象,如下所示:


    $placeId = $request['placeId'];

    $place = new Place();

    $place->place_id = $placeId;

    $place->save();

等于这个:


    $place = Place::create(['place_id' => $request['placeId']]);

然后你的控制器将减少到这个:


class PlaceController extends Controller

{

    public function likePlace(Request $request)

    {


        $user = User::find($request['userId']);

        $place = Place::create(['place_id' => $request['placeId']]);


        $user->places()->attach($place);

    }

}


查看完整回答
反对 回复 2021-06-19
  • 1 回答
  • 0 关注
  • 141 浏览

添加回答

举报

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