2017-06-15 45 views
0

哪里查询对于我曾经在我的模型附加属性,现在当我想要做where查询自定义属性,例如“类别”一些特殊的原因,我的脸与这个意思的错误无法找到与“类别”名称列!把雄辩导致另一个表在做Laravel 5.4

为了解决这个问题,我想如果我把我的查询结果放到临时表中,我可以做我想做的!

有人对此有任何想法吗?如果它对我有用,我如何将结果传输到临时表中?

回答

1

您将无法使用限制模型访问的动态领域的数据库中查询,因为那场很显然,在数据库中不存在。

但是,Collection对象具有相当强大的过滤功能,因此您可以在查询数据库后使用动态字段过滤Collection结果。这不像从数据库中检索结果之前过滤掉结果一样,但是您可能会遇到这样的情况:性能不是那么重要,或者代码清洁/维护成本超过性能成本。

作为一个例子,给出以下型号:

class Book extends Model 
{ 
    public function getCategoryAttribute() 
    { 
     if ($this->targetAge < 13) { 
      return 'child'; 
     } 

     if ($this->targetAge < 18) { 
      return 'teen'; 
     } 

     return 'adult'; 
    } 
} 

下面的查询将不能工作,因为category领域实际上并不存在于表中:

$childrenBooks = Book::where('category', 'child')->get(); // error: no category field 

但是,以下将起作用,因为您在从数据库返回的模型集合上调用where(),并且模型可以访问动态字段:

$childrenBooks = Book::get()->where('category', 'child'); 

这种情况下的问题是,虽然它可以工作,但它会从数据库获取所有书籍,并为每个书籍创建一个Model实例,然后通过该完整Collection进行筛选。但是,好处是您无需复制访问器方法中的逻辑。这是您需要权衡利弊的地方,并确定您的情况是否可以接受。

中间选择是创建模型的范围方法,让您的访问逻辑是只在一个地方重复(如果它可以被复制的查询):

class Book extends Model 
{ 
    public function getCategoryAttribute() 
    { 
     if ($this->targetAge < 13) { 
      return 'child'; 
     } 

     if ($this->targetAge < 18) { 
      return 'teen'; 
     } 

     return 'adult'; 
    } 

    public function scopeCategory($query, $category) 
    { 
     if ($category == 'child') { 
      return $query->where('target_age', '<', 13); 
     } 

     if ($category == 'teen') { 
      return $query->where(function ($query) { 
       return $query 
        ->where('target_age', '>=', 13) 
        ->where('target_age', '<', 18); 
      }); 
     } 

     return $query->where('target_age', '>=', 18); 
    } 
} 

然后你就可以使用这个查询范围,像这样:

$childrenBooks = Book::category('child')->get(); 

的这里的好处是逻辑应用到实际的查询,所以他们从数据库返回之前的记录是有限的。主要的问题是现在你的“类别”逻辑是重复的,一次在访问器中,一次在范围内。此外,只有当您可以将访问者逻辑转换为可由数据库查询处理的内容时,此功能才有效。

+0

我投了你的答案,因为包含了很多学习技巧,但我的问题没有解决这个!谢谢。 –

+0

@BehnamAzimi你尝试过什么,什么都不起作用? – patricus

+0

我想搜索每个频道的类别并选择具有我需要的类别的频道。通过你的方式,我不能做我的类别的哪里条款。我面临“表中不存在类别列”的错误。所以我尝试了很多东西,终于解决了我的问题!我将很快在[这个问题]中将其作为答案(https://stackoverflow.com/questions/44582775/where-query-after-wherehas-not-work-as-it-should-in-laravel-5-4/44582967?noredirect = 1个#comment76158424_44582967)。 –