2017-01-19 516 views
0

刀片視圖上的簡單發佈/取消發佈按鈕應在更新數據庫表列時提交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}', '[email protected]')->name('book.publish'); 
Route::post('book/unpublish/{unpublish}', '[email protected]')->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'); 
} 

有人可以幫我寫成一個功能這一點。目標是根據本書的狀態顯示一個按鈕。如果在數據庫中發佈,那麼按鈕應該顯示未發佈且相反的方式。

回答

3

控制器

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

    if ($publish->published === 1) { 
     $publish->published = 0; 
    } else { 
     $publish->published = 1; 
    } 

    $publish->save(); 
    return redirect()->route('book'); 
} 

查看

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

路線

Route::post('book/publish/{publish}', '[email protected]')->name('book.publish'); 

在控制器和視圖:

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

評估完全一樣

if ($publish->published) 

但我認爲它更清晰它明確寫入。

+0

工作完美!謝謝。 – VLS

+0

沒問題!不要忘記打勾作爲答案,以便其他人可以受益:) – Loek

+0

我相信我的回答更好。請檢查 – Paras

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}', '[email protected]')->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() !!} 
+0

謝謝你的回答。 – VLS

1

如果你想只改變狀態,您可以使用三元運算符:

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

或者你可以試試這個:

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

感謝您的回答。我喜歡這一點,但我並不那麼高級,我犯了錯誤,但對三元體系還沒有很好的理解。 @Loek的答案現在對我來說有點清晰。 – VLS

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}', '[email protected]')->name('book.publish'); 
Route::post('book/unpublish/{unpublish}', '[email protected]')->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方法。原因是,如果兩個不同的用戶同時發佈或取消發佈該書,而兩者都會相信所需的操作已執行,但真正發生的是完成後撤消!