获取属于条目集合的所有字段

时间:2014-05-10 03:54:07

标签: php laravel laravel-4 eloquent has-many

我有一个名为Entry的模型,其中包含许多fieldsfields是另一个表格,其中包含模型Fieldentry_id作为其中一个& #39; s列 - hasMany relationshipEntry模型相关联的链接:

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);

4 个答案:

答案 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();

whereHaswith混合:

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