我正在尝试将标记功能添加到我的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表,希望它能帮助诊断问题。
php - Laravel不使用 Eloquent 更新项目-LMLPHPphp - Laravel不使用 Eloquent 更新项目-LMLPHPphp - Laravel不使用 Eloquent 更新项目-LMLPHP
编辑2
我明白了为什么它没有更新resources表,我有另一个名为PostFlag的方法,它只是插入Flag_ReasonOther_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

希望这有帮助:)

10-06 03:55