2016-07-10 3 views
0
public function getDeleteQuote($quote_id) 
{ 
    $quote = Quote::find($quote_id); 
    $author_id = $quote->author_id; 
    $total_quote = DB::table('quotes')->where('author_id' , $author_id)->count(); 
    $author_deleted = false; 

    if($total_quote === 1) 
    { 
     $auth_deleted = DB::table('authors')->where('id' , $author_id)->delete(); 
     $author_deleted = true; 
    } 
    $quote->delete(); 
    $msg = $author_deleted ? 'Quote And Author Deleted !' : 'Quote Deleted !' ; 
    return redirect()->route('home')->with([ 
     'success' => $msg 
    ]); 
} 

最初の3行では、同じテーブルの1つを検索するquote_idと、同じ著者の見積りを数えます。しかし、私はこれを1回のクエリでしかやりたくありません。どうやってやるの ?laravel query builderの同じテーブルで1つのクエリで数えて検索する方法は?

+0

すべてのコードを脇に置きます。代わりに適切なCREATEとINSERTステートメントと望ましい結果を提供してください – Strawberry

+0

あなたはおそらくリレーションシップとカスケード削除を使ってこれをもっとよくすることができます。削除に関連する作者も削除しますが、もう少し必要なものを手に入れる必要があります –

答えて

0

'quotes'テーブルを参照するQuoteモデルと 'authors'テーブルに関連付けられたAuthorモデルがあると仮定して、Quoteクラスの関係を指定します。

class Quote{ 

    /*... other code here */ 

    public function authors(){ 
     return $this->hasMany('App\Author'); 
    } 
} 

次に、リレーションシップ関数を呼び出す変数にクエリビルダーを格納して使用できます。

public function getDeleteQuote($quote_id) 
{ 
    //Get The Quote Object 
    $quote = Quote::find($quote_id); 

    //Get the query builder from relationship and store in a variable 
    $quote_query = $quote->authors(); 

    //Delete authors with condition 
    $author_deleted = ($quote_query->count() === 1) ? $quote_query->delete() : false; 

    //Delete the Quote 
    $quote->delete(); 

    $msg = $author_deleted ? 'Quote And Author Deleted !' : 'Quote Deleted !' ; 
    return redirect()->route('home')->with([ 
     'success' => $msg 
    ]); 
} 

P.S. 1対1の関係にある場合$this->hasOne('App\Author');

+0

ありがとうございました。私のdatabseの関係が間違っています。 –

+0

Quoteモデル著者のモーダルとの関係を確立すると、私は非常に役に立ちます。前もって感謝します。 –

0

は試してみて、これが働くことができるかどうかを確認します。

public function getDeleteQuote($quote_id) 
{ 
    $quote = Quote::findOrFail($quote_id)->with('authors'); 

    if($quote->authors->count() > 0){ 
     $author_deleted = $quote->authors->delete(); 
    } 

    $quote->delete(); 

    return route('home')->with('success' => ($author_deleted) ? 'Quote And Author Deleted !' : 'Quote Deleted !'); 
} 

class Quote extends Model 
{ 
    /** 
    * get the associated author for the quote 
    */ 
    public function authors(){ 
     return $this->hasOne(Author::class); 
    } 

} 

その著者などで引用を見つける:

ここ

は言っている著者の関係に引用モデル

あなたのセットアップなどに依存するような問題などが表示されるかどうかは確かではありませんが、リレーションシップなどを調べればうまくいけません。

+0

ありがとう、私の問題は解決されますが、私はあなたがこれが働く方法を私に説明すれば素晴らしいです...。 if($ quote-> authors-> count()> 0){ $ author_deleted = $ quote-> authors-> delete(); } –

+0

これはわかりませんが、著者数が0より大きいかどうかを確認するため、$ author_deleted varにブール値0または1をtrueまたはfalseで返すような削除が試行されます。これが助けてくれることを願っています:-) –

+0

ええ、私はそれが欲しいですが、$ quote-> authors-> count()の仕組みを知りたいですか? –