哪里查询对于我曾经在我的模型附加属性,现在当我想要做where
查询自定义属性,例如“类别”一些特殊的原因,我的脸与这个意思的错误无法找到与“类别”名称列!把雄辩导致另一个表在做Laravel 5.4
为了解决这个问题,我想如果我把我的查询结果放到临时表中,我可以做我想做的!
有人对此有任何想法吗?如果它对我有用,我如何将结果传输到临时表中?
哪里查询对于我曾经在我的模型附加属性,现在当我想要做where
查询自定义属性,例如“类别”一些特殊的原因,我的脸与这个意思的错误无法找到与“类别”名称列!把雄辩导致另一个表在做Laravel 5.4
为了解决这个问题,我想如果我把我的查询结果放到临时表中,我可以做我想做的!
有人对此有任何想法吗?如果它对我有用,我如何将结果传输到临时表中?
您可以使用原始语句创建临时表。这篇文章去相当深入了它:
https://laracasts.com/discuss/channels/laravel/how-to-implement-temporary-table
您将无法使用限制模型访问的动态领域的数据库中查询,因为那场很显然,在数据库中不存在。
但是,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();
的这里的好处是逻辑应用到实际的查询,所以他们从数据库返回之前的记录是有限的。主要的问题是现在你的“类别”逻辑是重复的,一次在访问器中,一次在范围内。此外,只有当您可以将访问者逻辑转换为可由数据库查询处理的内容时,此功能才有效。
我投了你的答案,因为包含了很多学习技巧,但我的问题没有解决这个!谢谢。 –
@BehnamAzimi你尝试过什么,什么都不起作用? – patricus
我想搜索每个频道的类别并选择具有我需要的类别的频道。通过你的方式,我不能做我的类别的哪里条款。我面临“表中不存在类别列”的错误。所以我尝试了很多东西,终于解决了我的问题!我将很快在[这个问题]中将其作为答案(https://stackoverflow.com/questions/44582775/where-query-after-wherehas-not-work-as-it-should-in-laravel-5-4/44582967?noredirect = 1个#comment76158424_44582967)。 –
但是我想把我的查询结果放到临时表中,有可能吗? –
是的,我不明白为什么不,为什么不像内存中的SQLite连接,数据都在连接关闭下。 – btl