我有名为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');
}
}
答案 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']]);