【问题标题】:I can not make a query with Laravel我无法使用 Laravel 进行查询
【发布时间】:2019-04-25 11:03:36
【问题描述】:

早上好,我在尝试使用 Eloquent 创建简单查询时遇到了麻烦。

这是 mi colonia 模型:

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

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

如果我这样做了。

$response = Colonia::find(1)->city;

我收到了回复,但我不想通过 id 查找,我正在尝试做这样的事情。

$response = Colonia::where('codigo_postal', $codigo_postal)->city;

但它会给我一个错误。

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

如你所见,它是在上面声明的,我想这是一个语法问题,希望你能帮助我。

谢谢你,问候。

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-query-builder


    【解决方案1】:

    根据@HCK 的回答,解释了如何执行查询结果。这里我只是想改进一下直接返回列值的方式。

    $response = Colonia::where('codigo_postal', $codigo_postal)
        ->value('city');
    

    Laravel Documentation

    【讨论】:

      【解决方案2】:

      当你这样做时:

      $response = Colonia::find(1)->city;
      

      find() 方法将返回查询结果,在本例中为catalogo_colonias 表的第一个对象。单个对象,此对象具有您定义的所有属性,例如 city 关系。

      现在,当您改用where() 方法时,它还没有检索到关系对象,因为在某些情况下您希望继续限制查询。相反,它返回Query Builder 类的实例。这就是它抛出错误的原因:

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

      要获得结果,您需要附加 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.
      

      【讨论】:

      • 非常感谢您的热心帮助。
      • @MexaFireg 很高兴为您提供帮助。
      【解决方案3】:

      别担心。这很容易修复。您已指定要搜索的列。但是 Eloquent 并没有真正执行您的查询。

      如果你使用Model::where('col', $value'),你必须指定:

      1. 您想退回一个模型行吗?如果是这样,您可以使用first() p.s.它将返回找到的第一个,因此如果您尝试查找 Bob 的名字,并且您有记录 Bob1, Bob2, Bob3,它将首先返回 Bob1

      2. 是否要返回查询中的所有行,可以使用get()。您必须foreach您的收藏才能访问每个实例的关系。

      然后您可以访问您的关系属性。

      祝你好运!

      【讨论】:

        【解决方案4】:

        您的代码中的问题是 Colonia::where() 返回查询生成器。你需要提取它,使用方法first(),比如:

        $response = Colonia::where('codigo_postal', $codigo_postal)->first()->city;
        

        您可以使用两种方法从查询中提取信息:first()get()first() 仅返回找到的第一个元素,get() 返回包含整个结果的数组。

        我建议你阅读Laravel Query Builder - Where Clauses

        【讨论】:

          猜你喜欢
          • 2019-03-10
          • 2013-07-09
          • 1970-01-01
          • 1970-01-01
          • 2019-07-17
          • 1970-01-01
          • 2014-03-25
          • 2017-01-17
          • 2017-05-28
          相关资源
          最近更新 更多