首先我不得不说我试图找到解决方案,但我没有。
基本问题:
$Br = new BrandTop;
dd( $Br->limit(10)->get() ); // Will return 10 rows
和
$Br = new BrandTop;
$Br->limit(10);
dd( $Br->get() ); // Will return all rows.
那么,基本问题是 - 为什么?如何为模型设置一些限制,但仍然可以使用它,例如设置(或不设置)一些位置或顺序取决于其他变量。
高级问题:
我想像这样使用模型:
class BrandTop extends Model
{
public function withBrand() {
return $this->leftJoin('brand', 'brand.id' , '=', 'brandtop.brand_id');
}
public function forType($type) // there is much more conditions for type
{
return $this->where(['type' => $type]);
}
// main function
public function forSunglasses($limit = 0, $logo = false)
{
if ($logo)
$this->where(['menu_logo' => 1])->orderBy('total_sales', 'desc');
if ($limit)
$this->limit($limit);
return $this->forType('sunglasses')->withBrand();
// But there goes Error, because forType() return Builder object, and it has no withBrand() method
}
}
因此,条件要多得多,并且在单独的方法中设置所有条件要容易得多。但如何呢?
最佳答案
模型与构建器
这里需要理解的是 Model
对象和底层 Builder
(查询生成器)对象之间的区别。
语句$Br = new BrandTop;
将创建一个Model
的新实例,并将其分配给$Br
变量。接下来,$Br->limit(10)
语句将为brand_tops 表创建一个Builder
对象的新实例,并应用 10 个限制。
在第一个示例中,通过执行 $Br->limit(10)->get()
,您将在 上调用
。get()
应用了您的限制的构建器
在第二个示例中,您的个人 $Br->limit(10)
创建新的 Builder
实例,但从未将其用于任何用途。下一个语句 $Br->get()
创建另一个没有任何约束的新 Builder
实例,因此它检索所有记录。
为了能够构建查询,您需要将 Builder
实例分配给变量,并在最终调用 get()
之前继续修改该实例。例如,要使第二个示例正常工作:
$query = BrandTop::query();
$query->limit(10);
$query->where(/*conditions*/);
dd($query->get());
查询范围
关于问题的第二部分,您可能想研究 query scopes .
class BrandTop extends Model
{
// renamed to "JoinBrand" instead of "WithBrand", as "with" would imply
// an eager loaded relationship vs a joined table
public function scopeJoinBrand($query)
{
return $query->leftJoin('brand', 'brand.id' , '=', 'brandtop.brand_id');
}
// got rid of "for" prefix
public function scopeType($query, $type)
{
return $query->where('type', $type);
}
// got rid of "for" prefix
public function scopeSunglasses($query, $limit = 0, $logo = false)
{
if ($logo)
$query->where(['menu_logo' => 1])->orderBy('total_sales', 'desc');
if ($limit)
$query->limit($limit);
return $query->type('sunglasses')->joinBrand();
}
}
使用上述模型,您的代码将类似于:
dd(BrandTop::sunglasses()->get());
// or, more verbosely:
$query = BrandTop::query();
$query->sunglasses(); // $query already an object, no need to reassign it to itself
dd($query->get());
关于php - 在 Laravel 5.1 中将查询生成器条件设置为模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348751/