属性に何らかの条件を付けて、すべてのクラスの Entry をフェッチしようとしています。関係の 1 つであるタグは、積極的にロードする必要があります。
モデルはそのように見えます
class Tag extends Eloquent {
protected $table = 'tags';
protected $guarded = array();
public function entries()
{
return $this->belongsToMany('Entry');
}
}
class Entry extends Eloquent {
protected $table = 'entries';
protected $guarded = array();
public function tags()
{
return $this->belongsToMany('Tag');
}
public function user()
{
return $this->belongsTo('User');
}
public function votes()
{
return $this->hasMany('Votes');
}
}
二重外部キー entry_id,tag_id を持つテーブル entry_tag が存在します。
このコードを使用しようとしています。 (1)
$testEntries = Entry::with(array('tags' => function($query)
{
$query->where('tag_id', '=', '1');
}))->get();
ただし、何も返しません。以下のコードを使用しても、完全に無効になります。 (2)
$testEntries = Entry::with('tags')->get();
DB ログを調べると、クエリが正常であることがわかります。彼らは産む (3)
select `tags`.*, `entry_tag`.`entry_id` as `pivot_entry_id`, `entry_tag`.`tag_id` as `pivot_tag_id` from `tags` inner join `entry_tag` on `tags`.`id` = `entry_tag`.`tag_id` where `entry_tag`.`entry_id` in (?, ?, ?, ?, ?, ?, ?, ?)","bindings":["1","2","3","4","5","6","7","8"]
( 4)
select `tags`.*, `entry_tag`.`entry_id` as `pivot_entry_id`, `entry_tag`.`tag_id` as `pivot_tag_id` from `tags` inner join `entry_tag` on `tags`.`id` = `entry_tag`.`tag_id` where `entry_tag`.`entry_id` in (?, ?, ?, ?, ?, ?, ?, ?) and `tag_id` = ?","bindings":["1","2","3","4","5","6","7","8","1"]
クエリを手動で実行すると、どちらも機能します (そして結果が見つかります)。
私は何が欠けていますか?もう数時間頭を掻いています!
編集:
以下のように、運がなければ結果を表示しようとしました
Log::debug('testing fetching entries:: ' . json_encode($testEntries));
と
foreach(Entry::with('tags')->get() as $entry)
{
Log::debug('test1!! ' . json_encode($entry));
}
EDIT 2: 私はタグをそのエントリで取得しようとしました。
Tag::with('entries')->get();
しかし、それは(他の組み合わせとともに)毎回ゼロの結果を返します。テーブルをセットアップする方法で何か基本的なことを見逃しているのではないかと考えています。役立つ場合に備えて、試行(2)の完全な sql 出力を次に示します。
{"query":"select * from `entries`","bindings":[],"time":0.33},{"query":"select `tags`.*, `entry_tag`.`entry_id` as `pivot_entry_id`, `entry_tag`.`tag_id` as `pivot_tag_id` from `tags` inner join `entry_tag` on `tags`.`id` = `entry_tag`.`tag_id` where `entry_tag`.`entry_id` in (?, ?, ?, ?, ?, ?, ?, ?)","bindings":["1","2","3","4","5","6","7","8"],"time":0.74}