我有两个与多对多关系相关的数据库表journeys
和stops
。该关系还有第三个表journey_stop
(数据透视表)。
这是我的Journey.php
模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Journey extends Model
{
public function stops() {
return $this->belongsToMany('App\Stop');
}
}
和Stop.php
型号:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Stop extends Model
{
public function journeys(){
return $this->belongsToMany('App\Journey');
}
}
现在在我的控制器中,我编写了一个方法changeStop(stop, journey_id)
,该方法采用特定的journey_id
并为其指定一个停靠点。(即,在该特定stop
之间创建关系以及journey
)或从stop
移除journey
(如果已存在)。
以下是方法:
public function changeStop(Request $request, $id)
{
$stop = $request->all();
$journey = Journey::find($id);
if ($journey->stops()->contains($stop->id)) {
$journey->stops()->detach($stop->id);
}else{
$journey->stops()->attach($stop->id);
}
return $journey->stops();
}
但是带有if
语句的行会引发错误:
尝试获取非对象的属性
我还尝试使用DB
直接查询数据透视表,但它会抛出相同的错误。这是代码DB
:
public function changeStop(Request $request, $id)
{
$stop = $request->all();
$journey = Journey::find($id);
if (
DB::table('journey_stop')->where(
'journey_id',
$id
)->where(
'stop_id',
$stop->id
)->count() > 0
) {
$journey->stops->detach($stop->id);
} else {
$journey->stops->attach($stop->id);
}
return $journey->stops();
}
一切似乎都适合我。但它不起作用。我做错了什么?
感谢您的时间:)
答案 0 :(得分:2)
您也可以使用sync
方法构建多对多关联。 sync方法接受要放在中间表上的ID数组。将从中间表中删除不在给定数组中的任何ID。因此,在此操作完成后,只有给定数组中的ID将存在于中间表
$journey->stops()->sync([$stop_id])
要为上述代码工作,请尝试以下方法:
public function changeStop(Request $request, $id)
{
$stop = $request->all(); // returns an array
$journey = Journey::find($id);
if ($journey->stops->contains('id', $stop['id'])) {
$journey->stops()->detach($stop['id']);
} else {
$journey->stops()->attach($stop['id']);
}
return $journey->stops;
}