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

我有名为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');

    }

}


梵蒂冈之花
浏览 142回答 1
1回答

达令说

在多对多关系中,您应该定义两个关系,如下所示:用户名class User extends \Eloquent implements Authenticatable{&nbsp; &nbsp; use AuthenticableTrait;&nbsp; &nbsp; public function places()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->belongsToMany('App\Place', 'user_place', 'user_id', 'place_id');&nbsp; &nbsp; }&nbsp; &nbsp;//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^^^^^^^^^^^^}注意:鉴于您的中间表名称不遵循我们指定的命名约定,因此 Laravel 知道要查找表的位置。地方.php请注意,您提到您的 Place 模型的主键是place_id,这也与Laravel 约定不同,您应该指定它:protected $primaryKey = 'place_id'; // <----class Place extends Model{&nbsp; &nbsp; public function user()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return $this->belongsToMany('App\User', 'user_place', 'place_id', 'user_id');&nbsp; &nbsp; }}所以现在在你的控制器中:class PlaceController extends Controller{&nbsp; &nbsp; public function likePlace(Request $request)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $placeId = $request['placeId'];&nbsp; &nbsp; &nbsp; &nbsp; $userId = $request['userId'];&nbsp; &nbsp; &nbsp; &nbsp; $user = User::where('id', $userId)->first();&nbsp; &nbsp; &nbsp; &nbsp; $place = new Place();&nbsp; &nbsp; &nbsp; &nbsp; $place->place_id = $placeId;&nbsp; &nbsp; &nbsp; &nbsp; $place->save();&nbsp; &nbsp; &nbsp; &nbsp; $user->places()->attach($place);&nbsp; &nbsp; }}边注正如我所指出的,您可以节省几行用等效的句子替换一些句子:&nbsp; &nbsp; $userId = $request['userId'];&nbsp; &nbsp; $user = User::where('id', $userId)->first();使用find()方法,这等于:&nbsp; &nbsp; $user = User::find($request['userId']);然后,您可以使用createEloquent 模型的静态方法创建相关对象,如下所示:&nbsp; &nbsp; $placeId = $request['placeId'];&nbsp; &nbsp; $place = new Place();&nbsp; &nbsp; $place->place_id = $placeId;&nbsp; &nbsp; $place->save();等于这个:&nbsp; &nbsp; $place = Place::create(['place_id' => $request['placeId']]);然后你的控制器将减少到这个:class PlaceController extends Controller{&nbsp; &nbsp; public function likePlace(Request $request)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $user = User::find($request['userId']);&nbsp; &nbsp; &nbsp; &nbsp; $place = Place::create(['place_id' => $request['placeId']]);&nbsp; &nbsp; &nbsp; &nbsp; $user->places()->attach($place);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP