两个功能合二为一

时间:2017-01-19 13:13:05

标签: laravel laravel-5

刀片视图上的

简单发布/取消发布按钮应使用0 / 1更新提交时的数据库表列。

有两个按钮:

{!! Form::open(array('route' => array('book.publish', $book->id), 'method' => 'post')) !!}
    <button class='btn btn-default'>Publish</button>
{!! Form::close() !!}

{!! Form::open(array('route' => array('book.publish', $book->id), 'method' => 'post')) !!}
    <button class='btn btn-danger'>Unpublish</button>
{!! Form::close() !!}

两条路线

Route::post('book/publish/{publish}', 'BookController@publish')->name('book.publish');
Route::post('book/unpublish/{unpublish}', 'BookController@unpublish')->name('book.publish');

和控制器

public function publish($id){

    $publish = Books::find($id);

    $publish->published = 1;
    $publish->save();        

    return redirect()->route('book');

}

public function unpublish($id){

    $publish = Books::find($id);

    $publish->published = 0;
    $publish->save();        

    return redirect()->route('book');
}

有人可以帮我把它写成一个函数吗?目标是只显示一个按钮,具体取决于该书的状态。如果在数据库中发布,则按钮应显示未发布且相反的方式。

4 个答案:

答案 0 :(得分:3)

<强>控制器

@if($book->published === 1)
    // Show button to unpublish
@else
    // Show button to publish
@endif

查看

Route::post('book/publish/{publish}', 'BookController@togglePublish')->name('book.publish');

<强>路线

if ($publish->published === 1)

注意

在控制器和视图中:

if ($publish->published)

完全相同
{{1}}

但我认为明确地写它会更清楚。

答案 1 :(得分:1)

控制器:

public function publish($id, $status){
    $publish = Books::find($id);

    $publish->published = $status;
    $publish->save();        

    return redirect()->route('book');
}

路线:

Route::post('book/publish/{publish}/{status}', 'BookController@publish')->name('book.publish');

模板:

{!! Form::open(array('route' => array('book.publish', $book->id, 1), 'method' => 'post')) !!}
    <button class='btn btn-default'>Publish</button>
{!! Form::close() !!}

{!! Form::open(array('route' => array('book.publish', $book->id, 0), 'method' => 'post')) !!}
    <button class='btn btn-danger'>Unpublish</button>
{!! Form::close() !!}

答案 2 :(得分:1)

如果您只想更改状态,可以使用三元运算符:

$publish->published = $publish->published == 1 ? 0 : 1;

或者你可以试试这个:

$publish->published = !$publish->published;

答案 3 :(得分:1)

只需将您的观点更改为:

@if($book->published === 1)
{!! Form::open(array('route' => array('book.publish', $book->id), 'method' => 'post')) !!}
<button class='btn btn-default'>Publish</button>

@else
{!! Form::open(array('route' => array('book.unpublish', $book->id), 'method' => 'post')) !!}
<button class='btn btn-danger'>Unpublish</button>
@endif
{!! Form::close() !!}

路线:

Route::post('book/publish/{publish}', 'BookController@publish')->name('book.publish');
Route::post('book/unpublish/{unpublish}', 'BookController@unpublish')->name('book.unpublish');

控制器:

public function publish($id){

    Books::where('id', $id)->update(['published' => 1]);      
    return redirect()->route('book');

}

public function unpublish($id){

    Books::where('id', $id)->update(['published' => 0]);       
    return redirect()->route('book');
}

为什么这个答案比发布的其他答案好?

  1. 更好的查询效果:此答案仅调用在控制器中触发的1个查询,而其他答案至少调用2个查询(一个用于查找书籍,一个用于保存)
  2. 更好的用户体验:我建议不要使用控制器中的togglePublish方法。原因是,如果两个不同的用户同时发布或取消发布该书,他们会相信所需的操作已经执行,但真正发生的是它会完成然后撤消!