Laravel 不使用 Eloquent 更新项目

Posted

技术标签:

【中文标题】Laravel 不使用 Eloquent 更新项目【英文标题】:Laravel Not Updating Item Using Eloquent 【发布时间】:2017-03-31 03:17:44 【问题描述】:

我正在尝试将标记功能添加到我的网络应用程序中,但它似乎只工作了一半。我可以标记一个特定的资源,添加我标记的原因以及其他 cmets 就好了。一旦我查看了所有标记的资源,原因和 cmets 就会保存并更正,但我标记的资源都是相同的,在本例中为“救世军”。例如,我有 4 个被标记的资源,它们都显示了不同的被标记原因,但即使我没有标记“救世军”,资源本身也是一样的。

这是我的一些代码,希望你能帮助我弄清楚为什么 Eloquent 没有更新我在数据库中的项目:

资源模型

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');
    
标记资源模型

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 以检查是否进行了任何更改时,我的 Resources 表没有任何更改,但数据已输入到我的 Flagged 表中。之前尝试开发标记功能的开发人员将该 1 硬编码为“救世军”,这就是为什么只有那个在数据库中被标记的原因。此外,没有数据被插入到数据透视表中。

如果有人可以帮助我解决这个问题,我将不胜感激,我已经被这个问题困扰了大约一个月。

编辑 我已经添加了一些资源和标记 SQL 表的图片,希望它能帮助诊断问题

编辑 2

我知道为什么它没有更新 Resources 表,我有另一个名为 PostFlag 的方法,它只是插入 Flag_ReasonOther_Comments 而没有对 Resources 做任何事情,并且路由正在调用 @ 987654338@。现在我很困惑如何设置我的路线。在我编辑PostFlag 方法以更新Resource 表后,我现在拥有的路线是

Route::post('resource', ['as' =&gt; 'resource', 'uses'=&gt;'FlagsController@postFlag']);

如果我不触摸路线,我会在加载标记资源视图时收到Missing argument 1 for App\Http\Controllers\FlagsController::postFlag() 错误。如果我编辑路线以获取像 Route::post('resource/Resource_ID', ['as' =&gt; 'resource', 'uses'=&gt;'FlagsController@postFlag']); 这样的 ID,我会得到一个 Missing required parameters for [Route: resource] [URI: resource/Resource_ID])。我是否需要设置获取路线,如果需要,我该如何设置?

【问题讨论】:

【参考方案1】:

说实话,当您每次都创建一个新标志然后将其与资源关联时,我不确定您为什么真的使用belongsToMany 关系。 资源在此处hasMany('App\Models\Flagged')标记 belongsTo('App\Models\Resources')。但是...我的意思是,当您已经决定使用数据透视表时,我真的不能建议进行如此巨大的数据库更改。无论如何,我相信会为你解决一切……

第 1 部分

首先进行以​​下更改

在班级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 类。请删除那个。

第 2 部分

现在,在 控制器

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

希望这会有所帮助:)

【讨论】:

感谢您的帮助,Flag Reason &amp; Other Comments 已插入数据库,没有任何内容插入到数据透视表 FlaggedResources 中,Resources 表中的 Flagged 字段未更改。我在这些行&lt;td&gt; $resource-&gt;flags ? $resource-&gt;flags-&gt;first()-&gt;Other_Comments &lt;/td&gt; 上也遇到语法错误,它说: 应该在Other_Comments and Flag_Reason 之后。 好的,所以我修改了您的 2 个 &lt;td&gt; 语句,使其看起来像这样 &lt;td&gt; $resource-&gt;flags-&gt;Other_Comments &lt;/td&gt; 视图现在加载,但无论我标记什么,表视图都没有任何内容,但原因和 cmets仍在插入数据库中。 @JDubbleU 哦,是的,对不起......我忘了在内联条件语句中写 OR 部分......我已经编辑了我的答案(视图部分)。你能再试一次,让我知道它是否有效:) 我改了,但功能上没有区别。我的Resources 表中的“已标记”字段仍保持为 0,而不是更新为 1,并且 Flag_Reason and Other_Comments 被插入到 Flagged 表中。我不知道为什么我的Resources 表没有更新。

以上是关于Laravel 不使用 Eloquent 更新项目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 保存项目

Laravel Eloquent - 保存/更新相关的一对多关系数据

使用 Laravel Eloquent 使用复合键更新表

Laravel Eloquent - 更新()函数

如何在 laravel 5 中使用 Eloquent 更新数据透视表

Laravel eloquent 使用关系列更新列