我正在尝试将标记功能添加到我的web应用程序中,但它似乎只工作了一半。我可以标记一个特定的资源,添加标记的原因以及其他注释。一旦我查看了所有标记的资源,就可以保存并更正原因和评论,但是我标记的资源都是相同的,在本例中是“救世军”。例如,我有4个被标记的资源,它们都显示了被标记的不同原因,但资源本身是相同的,即使我没有标记“救世军”。
下面是我的一些代码,希望您能帮助我找出为什么雄辩不更新数据库中的项目:
资源模型
class Resources extends Model
{
protected $table = 'Resources';
protected $primaryKey = 'Resource_ID';
public $timestamps = false;
protected $fillable = [
'Name',
'Description',
'Misc_Info',
'Flagged'
];
protected $guarded = [];
//referencing the pivot table for Flagged and Resources
public function flags()
{
return $this->belongsToMany('App\Models\Flagged', 'FlaggedResources', 'Resource_ID', 'Flag_ID');
}
标志模型
class Flagged extends Model
{
protected $table = 'Flagged';
protected $primaryKey = 'Flag_ID';
public $timestamps = false;
protected $fillable = [
'Flag_Reason',
'Other_Comments'
];
protected $guarded = [];
//references the pivot table for Flagged and Resources
public function resource()
{
return $this->belongsToMany('App\Models\Resource', 'FlaggedResources');
}
}
FlaggedResources模型
class FlaggedResources extends Model
{
protected $table = 'FlaggedResources';
public $timestamps = false;
protected $fillable = [
'Resource_ID',
'Flag_ID'
];
protected $guarded = [];
}
旗杆控制器
public function index()
{
$resource = Resources::where('Flagged', 1)->with('flags')->get();
$flag = Flagged::all();
return view('pages.flags', ['flagged' => $resource], ['flag' => $flag]);
}
public function addFlag($id)
{
$resource = Resources::where('Resource_ID', '=', $id)->update(array('Flagged' => 1));
$flag = Flagged::create(Request::all());
$resource->save();
$flag->save();
return back();
}
如果
Flagged=1
它会显示在视图中,如果Flagged=0
它不会显示。标志视图
<table class=" display table table-hover table-bordered" , id="flaggedResources">
<thead>
<th>Name</th>
<th>Description</th>
<th>Flagged Reason</th>
<th>Other Comments</th>
<th>Functions</th>
</thead>
<tbody>
@foreach ($flagged as $flags) @foreach ($flag as $flaggedRes)
<tr>
<td>{{ $flags->Name }}</td>
<td>{{ $flags->Description }}</td>
<td>{{ $flaggedRes -> Flag_Reason }}</td>
<td>{{ $flaggedRes -> Other_Comments }}</td>
@endforeach @endforeach
</tbody>
</table>
当我检查mysqlworkbench时,为了检查是否进行了任何更改,我的资源表没有任何更改,但是数据被输入到我的标记表中。前一个开发人员曾试图开发标记功能,他将1硬编码为“救世军”,因此数据库中只标记了1。此外,没有数据被插入到透视表中。
如果有人能帮我解决这个问题,我将不胜感激,我已经在这个问题上困了大约一个月了。
编辑
我已经添加了一些资源图片和标记的sql表,希望它能帮助诊断问题。
编辑2
我明白了为什么它没有更新resources表,我有另一个名为
PostFlag
的方法,它只是插入Flag_Reason
和Other_Comments
,而没有对Resources
做任何操作,路由正在调用PostFlag
。现在我对如何设置路线感到困惑。在编辑了更新PostFlag
表的Resource
方法之后,我现在拥有的路由是Route::post('resource', ['as' => 'resource', 'uses'=>'FlagsController@postFlag']);
如果我不接触路由,则在加载标记的资源视图时会出现
Missing argument 1 for App\Http\Controllers\FlagsController::postFlag()
错误。如果我编辑路径以接受id,那么我得到一个Route::post('resource/{Resource_ID}', ['as' => 'resource', 'uses'=>'FlagsController@postFlag']);
。我需要设置一条到达路线吗?如果需要,我如何设置? 最佳答案
老实说,我不知道为什么每次创建一个新标志并将其与资源关联时,您真的要使用一个belongsToMany
关系。这里的资源hasMany('App\Models\Flagged')
并标记为belongsTo('App\Models\Resources')
。但还是…我的意思是,当您已经决定使用pivot表时,我真的不能建议这么大的数据库更改。无论如何,我相信会为你解决一切…
第一部分
首先进行以下更改
在课堂上Resources
public function flags()
{
return $this->belongsToMany('App\Models\Flagged', 'FlaggedResources')->withPivot(['Resource_ID', 'Flag_ID']);
}
在课堂上
Flagged
public function resources()
{
return $this->belongsToMany('App\Models\Resource', 'FlaggedResources')->withPivot(['Resource_ID', 'Flag_ID']);
}
不需要类
FlaggedResources
。请删除这个。第二部分
现在,在控制器里
public function index()
{
$resources = Resources::where('Flagged', 1)->with('flags')->get();
return view('pages.flags', ['resources' => $resources]);
}
public function addFlag($id)
{
$flag = Flagged::create(Request::all());
$resource = Resources::findOrFail($id);
$resource->update(array('Flagged' => 1));
$resource->flags()->attach([$flag->id]);
return back();
}
在视野中
@foreach ($resources as $resource)
<tr>
<td>{{ $resource->Name }}</td>
<td>{{ $resource->Description }}</td>
<td>{{ $resource->flags ? $resource->flags->first()->Flag_Reason : 'None' }}</td>
<td>{{ $resource->flags ? $resource->flags->first()->Other_Comments : 'None' }}</td>
</tr>
@endforeach
希望这有帮助:)