我有一个名为Entry
的模型,其中包含许多fields
(fields
是另一个表格,其中包含模型Field
和entry_id
作为其中一个& #39; s列 - hasMany relationship与Entry
模型相关联的链接:
class Entry extends \Eloquent {
public function fields() {
return $this -> hasMany('Field');
}
}
我试图获取属于条目集合的所有字段,但是如果我尝试
Entry::where('form_id', $formId) -> fields
// There are multiple entries for each form_id
它会引发错误
Undefined property: Illuminate\Database\Eloquent\Builder::$fields
尝试在集合上执行此操作
Entry::where('form_id', $formId) -> get() -> fields
Undefined property: Illuminate\Database\Eloquent\Collection::$fields
仅针对第一条记录尝试相同的方法,按预期工作
Entry::where('form_id', $formId) -> first() -> fields
那么,有没有雄辩的方法来做到这一点?
现在,我能想到的是循环遍历所有条目并手动合并它们的字段,或类似
$entries = Entry::where('form_id', $formId) -> get();
$entryIDs = array();
foreach($entries as $entry) {
$entryIDs [] = $entry -> id;
}
$fields = Field::whereIn('entry_id', $entryIDs);
答案 0 :(得分:2)
看起来您的关系是这样的:Form
hasMany(或hasOne)Entry
hasMany Field
,对吧?
因此,您可以使用Eloquent提供的速记来表达您想要做的事情:
// Form model
public function fields()
{
return $this->hasManyThrough('Field', 'Entry');
}
通过这种方式,您可以获得所需的所有字段,提供表单模型,就像这样简单:
$fields = Form::find($formId)->fields; // Collection of Field models
为字段添加约束:
$fields = Form::find($formId)->fields() // return query builder object...
->where('entry_id', '=', 'value') // ... so you can chain any builder method
->orderBy('something') // for example order by
->get(); // don't forget to return results with get()
编辑2
根据您的评论,获取字段和条目的最简单方法是:
1加载与外部where
匹配的字段以及与内部where
子句匹配的每个字段的条目:
$fields = $form->fields()->where('x','=','value') // filter fields
->with(['entry' => function ($q) use ($entriesConstraint) {
$q->where('entriesColumn', '=', $entriesConstraint);
}])->get();
2加载与外部where
匹配的字段,并使相关条目匹配内部where
(以及每个字段的条目):
$fields = $form->fields()->where('x','=','value') // filter fields
->whereHas('entry', function ($q) use ($entriesConstraint) {
$q->where('entriesColumn', '=', $entriesConstraint);
})->with('entry')
->get();
whereHas
和with
混合:
User::whereHas('categories', function ($q) {
$q->where('name','like','%lo%'); // first constraint to fetch entries
})->with(['categories'=>function($q){
$q->where('name','like','%o%') // another constraint for processing related model
->selectRaw('categories.id as id,avg(categories.id) as avg') // raw for fancy aggregate
->groupBy('category_user.user_id'); // group by for aggregate
}])->get();
答案 1 :(得分:1)
一种可能的解决方案:
获取所有/指定的条目并急切加载字段,然后循环遍历
$fields = Entry::with(['fields'])->where('form_id', $formId)->get()->lists('fields');
foreach ($fields AS $field) { var_dump($field->toArray()); }
答案 2 :(得分:1)
Entry::where('form_id', $formId) -> fields
我们应该重写如下:
$entries = Entry::where('form_id', $formId)->with('fields')->get();
您将拥有一个包含其字段的条目集合。 Dane说,你可以使用lists
。
答案 3 :(得分:0)
所以看起来您正在尝试选择单个列并将结果作为数组。
看起来QueryBuilder有一种方法可以做到这一点
$roles = DB::table('roles')->lists('title');
但Eloquent似乎并不是,至少没有开箱即用。但是,如果您使用的是PHP> = 5.5.0
,则可以使用您的收藏集,使用->toArray()
,然后使用PHP array_column