我无法使用Laravel进行查询

Mex*_*reg 1 laravel eloquent laravel-5 laravel-query-builder

早上好,尝试用Eloquent创建一个简单查询时遇到麻烦。

这是mi Colonia模型:

class Colonia extends Model
{
    protected $table = 'catalogo_colonias';   

    public function city()
    {
        return $this->belongsTo('App\City', 'ciudades_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我做。

$response = Colonia::find(1)->city;
Run Code Online (Sandbox Code Playgroud)

我正在得到答复,但我不想通过id查找,我正在尝试做出这样的事情。

$response = Colonia::where('codigo_postal', $codigo_postal)->city;
Run Code Online (Sandbox Code Playgroud)

但这给我一个错误。

未定义的属性:Illuminate \ Database \ Eloquent \ Builder :: $ city

如您所见,它已在上面声明,我想这是一个语法问题,希望对您有所帮助。

谢谢你,问候。

Ken*_*rna 5

当您这样做时:

$response = Colonia::find(1)->city;
Run Code Online (Sandbox Code Playgroud)

find()方法将返回查询结果,在这种情况下为catalogo_colonias表的第一个对象。一个对象,该对象具有您定义的所有属性,例如city关系。

现在,当您改用where()方法时,它仍未检索到关系对象,因为在某些情况下,您将希望继续限制查询。而是返回查询生成器类的实例。这就是为什么它会引发错误:

$response = Colonia::where('codigo_postal', $codigo_postal) // return query builder
                 ->city; // this property isn't defined in the builder, hence, the error.
Run Code Online (Sandbox Code Playgroud)

要获取结果,您需要附加get()(以获取与查询匹配的所有结果)或first()或等等。

$response = Colonia::where('codigo_postal', $codigo_postal) // query builder
                 ->first() // returns an instance of Colonia
                 ->city; // now it can access the model properties.
Run Code Online (Sandbox Code Playgroud)