尝试使用attach()填充中间表,但获取“调用未定义的方法Illuminate \ Database \ Eloquent \ Relations \ HasMany :: attach()”

时间:2019-05-14 15:58:46

标签: php laravel eloquent

我有名为usersplacesuser_place的表。 users有一个名为id的列,其中包含用户ID,而场所也有一个名为place_id的列。 user_place表有2列,分别为user_idplace_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 个答案:

答案 0 :(得分:1)

Many to Many relationship中,您应该定义两个关系,如下所示:

User.php

ressources

注意:鉴于您的中间表名称不遵循我们指定的naming convention,因此Laravel知道要在哪里查找表。

Place.php

请注意,您提到Place模型的主键是class User extends \Eloquent implements Authenticatable { use AuthenticableTrait; public function places() { return $this->belongsToMany('App\Place', 'user_place', 'user_id', 'place_id'); } // ^^^^^^^^^^^^ } ,而这也要从Laravel convention转义,您应该指定它:

place_id

现在在您的控制器中:

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

使用find()方法等于:

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

然后,您可以使用Eloquent模型的静态方法 $user = User::find($request['userId']); 创建相关对象,这样:

create

等于这个:

    $placeId = $request['placeId'];
    $place = new Place();
    $place->place_id = $placeId;
    $place->save();

然后您的控制器将被简化为:

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