2017-10-07 10 views
1

モデルは「ユーザーの進捗状況」を持つことができ、ユーザーはスタックをクリアできます。その進捗状況はProgressモデルに保存されています。コレクション全体ではなくブール値を返します

Progressモデル:

public function stack(){ 
    return $this->belongsTo(Stack::class); 
} 

、すべてのスタックを取得することが可能であった場合、それはきちんとしただろう、とユーザーは、真または偽のブール値で、それを「クリア」またはされていない場合。私は進行状況に対応するすべてのデータを取得しないでください。だから私はStackモデル

public function finished(){ 
    return $this->hasOne(Progress::class) ? true : false; 
} 

の「仕上げ」の関係を設定しようとしている。しかし、このセットアップは私に次のエラー Call to a member function addEagerConstraints() on booleanを与えます。

これは私が

$user = \App\Stack::with(['finished' => function($q){ 
     return $q->where('user_id', auth()->user()->id); 
    }])->get(); 

現時点で関係を呼び出すしかし、それは全体のコレクションを返し、それが必要ではない方法です。期待される結果は次のようになります:

{ 
"id": 5, 
"user_id": 2, 
"subject_id": 2, 
"name": "tstar igen", 
"slug": "tstar-igen", 
"description": "asdasd", 
"image": null, 
"created_at": "2017-10-06 08:27:36", 
"updated_at": "2017-10-06 08:27:36", 
"finished": true/false 
}, 

ここで、上記のスタックの進捗表の関係エントリがあります。

+----+---------+----------+ 
| id | user_id | stack_id | 
+----+---------+----------+ 
| 1 |  1 |  5 | 
+----+---------+----------+ 

したがって、スタックをフェッチするとき、リレーションフィニッシュを使用します。 finished列は真または偽でなければなりません。従ってStackからの返信は、finishedの関係で次のようになります。リレーションが進捗テーブルに存在しないため、最後のスタックで完了した列がfalseに変更されていることに注意してください。あなたはほぼ完了している

{ 
"id": 5, 
"user_id": 2, 
"subject_id": 2, 
"name": "tstar igen", 
"slug": "tstar-igen", 
"description": "asdasd", 
"image": null, 
"created_at": "2017-10-06 08:27:36", 
"updated_at": "2017-10-06 08:27:36", 
"finished": true 
}, 
{ 
"id": 6, 
"user_id": 2, 
"subject_id": 2, 
"name": "another stack", 
"slug": "another-stack", 
"description": "This is a test stack for all the stacks out there", 
"image": null, 
"created_at": "2017-10-06 08:27:36", 
"updated_at": "2017-10-06 08:27:36", 
"finished": false 
}, 
+0

あなたは達成しようとしていることをあなたの質問からうまく説明できますか?ユーザーの「完了」ステータスが「true」または「false」のすべてのスタックをフィルタリングしますか? –

+0

詳細を含む私の質問を編集しました – Adam

答えて

0

は、あなたがうまくブール詰め込む以外のあなたの関係を設定している、それを削除します。

public function finished(){ 
    return $this->hasOne(Progress::class); 
} 

を次にあなたがhasまたはwhereHas関係のメソッドを使用することができますチェックする必要がある場合:

$stack = \App\Stack::whereHas('finished', function($q){ 
    return $q->where('user_id', auth()->user()->id); 
})->get(); 

あなたの必要性に基づいて、私が想像できる最高のものです。これで十分だと思います。

has and whereHasの仕組みを知ることはうまくいくでしょう。しかし、要約するとhasは、whereHasのようなもので、最初のモデルに少なくとも1つのモデルがあるかどうかをチェックし、もう1つは、私が与えた例に示すように、より高度な制約を作るのに役立ちます。

+0

お返事ありがとうございます!しかし、スタックモデルのAPIとAPIを構築しようとしているので、ユーザーの進行状況を追跡できます。だから、すべてのスタックが必要で、終了しているかどうか。 – Adam

0

withCountは、関連するモデルを数えます。しかし、ブール値ではない関連モデルの数を返します。次に例を示します。

スタックPHPその後、

public function progress(){ 
    return $this->hasOne(Progress::class); 
} 

\App\Stack::withCount('progress')->get(); 

が今の結果は、関連する '進捗状況' モデルの数とcount_progress属性を持っています。あなたの関係はhasOneなので、0または1でなければなりません。

関連する問題