Laravel在where子句静态方法中具有列名

时间:2020-02-14 10:11:49

标签: laravel eloquent laravel-query-builder

最近,我刚刚意识到,当使用驼峰式大小写加入where子句时,Laravel会生成带有列名的静态方法

示例

$user = User::whereName('john')->first(); // added `name` as a column name

当将此代码调用到SQL时,它会生成

$user = User::whereName('john')->toSql();

//it returns
select * from `users` where `name` = ?

当返回名称为john的用户时,确实可以得到预期的结果。

我已经搜索过Laravel文档,但是找不到此函数或定义的位置。

我需要澄清的是这个方法是好还是最好,以便我可以继续使用它,并知道该方法是如何在Laravel框架内或其他任何方式生成的

4 个答案:

答案 0 :(得分:1)

这种方法是完全合法的,您没有充分的记录。在Query\Builder中,它利用__call函数覆盖来产生功能,您可以看到确切的函数here

魔术方法和__call函数的主题,如果它们变得更好,通常是值得商de的。如果您使用IDE helper。它实际上会为您键入提示方法,从而减轻它所采用的一些神奇方法,并为您提供流畅的IDE体验。

我从本地项目生成的类型提示的示例。

* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\User whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\User whereEmail($value)

因此,我不必担心这不是最好的方法。做事的方法有很多,但这是正确的方法之一。

答案 1 :(得分:1)

如果您要问代码在哪里工作,它是在类import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { SearchPageComponent } from './search-page/search-page.component'; import { SearchPageService } from './search-page/search-page.service'; import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ AppComponent, SearchPageComponent ], imports: [ BrowserModule,BrowserAnimationsModule,FormsModule, ReactiveFormsModule,HttpClientModule ], providers: [SearchPageService], bootstrap: [AppComponent] }) export class AppModule { } 中使用魔术方法__call()(在创建实例之前使用__callStatic())< / p>

Illuminate\Database\Query\Builder

恰好在条件/** * Handle dynamic method calls into the method. * * @param string $method * @param array $parameters * @return mixed * * @throws \BadMethodCallException */ public function __call($method, $parameters) { if (static::hasMacro($method)) { return $this->macroCall($method, $parameters); } if (Str::startsWith($method, 'where')) { return $this->dynamicWhere($method, $parameters); } static::throwBadMethodCallException($method); } 中将呼叫重定向到Str::startsWith($method, 'where')

dynamicWhere()

答案 2 :(得分:0)

尝试

$user = User::where('name','john')->first();

答案 3 :(得分:0)

您需要在模型中定义此功能

//controller
$userObj=new \App\User();
$userObj->whereName('john');
//model
function whereName($name){
return $this->where('name',$name)->first();
}