where条件を持つモデルhasManyリレーにアクセスする方法は?
2023-09-22 22:39:08
質問
以下のように、リレーションの条件・制約を使用してモデルGameを作成しました。
class Game extends Eloquent {
// many more stuff here
// relation without any constraints ...works fine
public function videos() {
return $this->hasMany('Video');
}
// results in a "problem", se examples below
public function available_videos() {
return $this->hasMany('Video')->where('available','=', 1);
}
}
なんとなく使うときはこんな感じ。
$game = Game::with('available_videos')->find(1);
$game->available_videos->count();
はすべて正常に動作し、rolesが結果のコレクションとなります。
私の問題です。
イーガーローディングをせずにアクセスしようとすると
$game = Game::find(1);
$game->available_videos->count();
と表示され、Exceptionがスローされます。 非オブジェクトのメンバ関数 count() の呼び出し "と表示されます。
を使って
$game = Game::find(1);
$game->load('available_videos');
$game->available_videos->count();
はうまく動作しますが、リレーション内で条件を使用しない場合、関連するモデルをロードする必要がないので、私には非常に複雑に見えます。
私は何かを見逃していますか?イーガーローディングを使用せずに、available_videos にアクセスできることを確認するにはどうしたらよいでしょうか。
興味のある方のために、私はこの問題を次のサイトにも投稿しました。 http://forums.laravel.io/viewtopic.php?id=10470
どのように解決するのですか?
同じ問題に遭遇した人がいる場合に備えて。
リレーションはキャメルケースである必要があることに注意してください。ですから、私の場合、available_videos() は availableVideos() であるべきでした。
Laravelのソースを調べれば、簡単に分かります。
// Illuminate\Database\Eloquent\Model.php
...
/**
* Get an attribute from the model.
*
* @param string $key
* @return mixed
*/
public function getAttribute($key)
{
$inAttributes = array_key_exists($key, $this->attributes);
// If the key references an attribute, we can just go ahead and return the
// plain attribute value from the model. This allows every attribute to
// be dynamically accessed through the _get method without accessors.
if ($inAttributes || $this->hasGetMutator($key))
{
return $this->getAttributeValue($key);
}
// If the key already exists in the relationships array, it just means the
// relationship has already been loaded, so we'll just return it out of
// here because there is no need to query within the relations twice.
if (array_key_exists($key, $this->relations))
{
return $this->relations[$key];
}
// If the "attribute" exists as a method on the model, we will just assume
// it is a relationship and will load and return results from the query
// and hydrate the relationship's value on the "relationships" array.
$camelKey = camel_case($key);
if (method_exists($this, $camelKey))
{
return $this->getRelationshipFromMethod($key, $camelKey);
}
}
これは、以前load()メソッドを使ってデータを読み込んだときはいつでも、私のコードが動作した理由も説明しています。
とにかく、私の例は現在完全に問題なく動作し、$model->availableVideos は常にコレクションを返します。
関連
-
[解決済み] Laravel Eloquentを使用して複数のWhere句クエリを作成する方法?
-
[解決済み] Laravel. リレーションを持つモデルでscope()を使用する
-
[解決済み] 2つのCarbon Timestampを比較するには?
-
[解決済み] Laravel Eloquent - 1つの行を取得する
-
[解決済み] LaravelのBladeテンプレートで、レイアウトに変数を渡すには?
-
[解決済み] Laravel 多対多のリレーションシップの保存/更新
-
[解決済み] ピボットテーブルのデータ添付でタイムスタンプが更新されない
-
[解決済み] Laravel 4: SQLを実行するには?
-
[解決済み] ファースト・オア・クリエイト
-
Laravel 5+でデータベースからカラムを削除する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Laravel. リレーションを持つモデルでscope()を使用する
-
[解決済み] Laravelで「キャッシュのクリアに失敗しました。適切なパーミッションがあることを確認してください"
-
[解決済み] Laravel Eloquent - 1つの行を取得する
-
[解決済み] Laravel コントローラ サブフォルダ ルーティング
-
[解決済み] Laravel Eloquentのリミットとオフセット
-
[解決済み] UnixタイムスタンプをCarbonオブジェクトに変換する
-
[解決済み] ログはどこにあるのですか?
-
[解決済み] Laravel - カスタムカラムで検索するか、失敗するか
-
LaravelのEloquent/Fluentで全ての行に同じ値を設定する方法とは?
-
Laravel 5+でデータベースからカラムを削除する