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);
}
}
- 1 回答
- 0 关注
- 141 浏览
添加回答
举报