最近,我刚刚意识到,当使用驼峰式大小写加入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框架内或其他任何方式生成的
答案 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();
}