Php Laravel-在何处存储通用模型函数以及如何从控制器访问它们?
我的大多数型号都使用了许多功能 因此,集中存储它们而不是重复代码是有意义的 例如,我有一个函数,可以从我需要的任何表中查找随机行:Php Laravel-在何处存储通用模型函数以及如何从控制器访问它们?,php,laravel,model-view-controller,model,extends,Php,Laravel,Model View Controller,Model,Extends,我的大多数型号都使用了许多功能 因此,集中存储它们而不是重复代码是有意义的 例如,我有一个函数,可以从我需要的任何表中查找随机行: function getRandomRow() { $rowCount = DB::connection('mydatabasename') ->table('my_table_name') ->selectRaw("FLOOR(RAND() * COUNT(*)) AS offse
function getRandomRow() {
$rowCount = DB::connection('mydatabasename')
->table('my_table_name')
->selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = DB::connection('mydatabasename')
->table('my_table_name')
->select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
我已经研究了extends和-以及-但是还不清楚哪个是最有效的,以及如何访问与公共函数中使用的模型相关联的表名
我的问题是:
-我应该将此功能放在哪里,以便所有型号都可以使用它?
-如何编写代码以使“my_table_name”使用正确的模型表?我发现的最简单的解决方案是创建一个父模型/类-如在另一个问题中所述-对于当前示例,让我们称之为BaseModel 对于Laravel,它与其他型号一起直接存储在应用程序目录中 …在我的例子中,父模型/类可以是抽象的,因为它不需要有自己的表,这也意味着BaseModel函数只能通过子模型访问:
namespace App;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
// ...put common model functions here
}
在BaseModel函数需要访问子模型表的情况下,实现此功能的诀窍是:
-让每个子模型/类扩展BaseModel类
-确保在所有子模型中定义了$表-注意:
这意味着$this->table可以在BaseModel抽象父类中用于引用子模型/类的指定$table:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
abstract class BaseModel extends Model
{
function getRandomRow() {
$rowCount = DB::connection('mydatabasename')
->table($this->table)
->selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$profileRow = DB::connection('mydatabasename')
->table($this->table)
->select()
->offset($offset)
->limit(1)
->first();
return $profileRow;
}
}
现在,通过控制器,您可以通过子模型访问存储在BaseModel中的任何函数:
namespace App\Http\Controllers;
use App\MyFunkyModel;
use App\MySeriousModel;
use App\MyHappyModel;
class MyController extends Controller
{
public function getRandomName($type){
switch ($type) {
case 'funky':
$modelFunky = new MyFunkyModel;
$funkyRow = $modelFunky->getRandomRow();
$randomName = $funkyRow->funky_name_column;
break;
case 'serious':
$modelSerious = new MySeriousModel;
$seriousRow = $modelSerious->getRandomRow();
$randomName = $seriousRow->serious_name_column;
break;
case 'happy':
$modelHappy = new MyHappyModel;
$happyRow = $modelHappy->getRandomRow();
$randomName = $happyRow->happy_name_column;
break;
return $randomName;
}
}
我发现的最简单的解决方案是创建一个父模型/类——正如在另一个问题中所指出的那样——对于当前的示例,让我们称之为BaseModel 对于Laravel,它与其他型号一起直接存储在应用程序目录中 …在我的例子中,父模型/类可以是抽象的,因为它不需要有自己的表,这也意味着BaseModel函数只能通过子模型访问:
namespace App;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
// ...put common model functions here
}
在BaseModel函数需要访问子模型表的情况下,实现此功能的诀窍是:
-让每个子模型/类扩展BaseModel类
-确保在所有子模型中定义了$表-注意:
这意味着$this->table可以在BaseModel抽象父类中用于引用子模型/类的指定$table:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
abstract class BaseModel extends Model
{
function getRandomRow() {
$rowCount = DB::connection('mydatabasename')
->table($this->table)
->selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$profileRow = DB::connection('mydatabasename')
->table($this->table)
->select()
->offset($offset)
->limit(1)
->first();
return $profileRow;
}
}
现在,通过控制器,您可以通过子模型访问存储在BaseModel中的任何函数:
namespace App\Http\Controllers;
use App\MyFunkyModel;
use App\MySeriousModel;
use App\MyHappyModel;
class MyController extends Controller
{
public function getRandomName($type){
switch ($type) {
case 'funky':
$modelFunky = new MyFunkyModel;
$funkyRow = $modelFunky->getRandomRow();
$randomName = $funkyRow->funky_name_column;
break;
case 'serious':
$modelSerious = new MySeriousModel;
$seriousRow = $modelSerious->getRandomRow();
$randomName = $seriousRow->serious_name_column;
break;
case 'happy':
$modelHappy = new MyHappyModel;
$happyRow = $modelHappy->getRandomRow();
$randomName = $happyRow->happy_name_column;
break;
return $randomName;
}
}
您可以同时使用继承和特征。但强烈建议使用雄辩的模型,而不是DB::table。原因是,如果表名以某种方式发生更改,则必须在任何地方更改它。使用Elounting,您只需在模型中提及一次表名
protected $table = 'new_table_name'
使用继承
按如下方式构造基本模型和类
class BaseModel extends Model {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourModel extends BaseModel {
// getRandomRow() available here
}
trait BaseTrait {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourClass {
use BaseTrait;
// getRandomRow() available here
}
使用特性
按照以下方式组织你的特质和职业
class BaseModel extends Model {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourModel extends BaseModel {
// getRandomRow() available here
}
trait BaseTrait {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourClass {
use BaseTrait;
// getRandomRow() available here
}
无论哪种方式,您都可以访问您的方法,如
class yourController {
public function youMethod()
{
$rows = YourModel::getRandomRow();
}
}
您可以同时使用继承和特征。但强烈建议使用雄辩的模型,而不是DB::table。原因是,如果表名以某种方式发生更改,则必须在任何地方更改它。使用Elounting,您只需在模型中提及一次表名
protected $table = 'new_table_name'
使用继承
按如下方式构造基本模型和类
class BaseModel extends Model {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourModel extends BaseModel {
// getRandomRow() available here
}
trait BaseTrait {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourClass {
use BaseTrait;
// getRandomRow() available here
}
使用特性
按照以下方式组织你的特质和职业
class BaseModel extends Model {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourModel extends BaseModel {
// getRandomRow() available here
}
trait BaseTrait {
public static function getRandomRow()
{
$rowCount = self::selectRaw("FLOOR(RAND() * COUNT(*)) AS offset")
->first();
$offset = $rowCount->offset;
$randomRow = self::select()
->offset($offset)
->limit(1)
->first();
return $randomRow;
}
}
class YourClass {
use BaseTrait;
// getRandomRow() available here
}
无论哪种方式,您都可以访问您的方法,如
class yourController {
public function youMethod()
{
$rows = YourModel::getRandomRow();
}
}
你找到解决办法了吗?我把我的解决方案贴在下面你能找到解决方案吗?我把我的解决方案贴在下面感谢回复。在继承类型BaseModel中使用静态函数(对于Traits和Helpers显然是必要的)有什么理由吗?虽然从技术上讲这是可能的,但它创建的代码在某些方面是不一致的-模型中的一半函数将由MyModel->modelFunction调用,另一半由MyModel::modelFunction调用-这是另一个编码中的减速,记住哪些函数在MyModel中,也感谢关于Eloquent vs Query Builder的建议——我们发现Eloquent对复杂查询的限制太大了——所以我们只使用Query Builder。此外,您可以在QB中使用$this->table来避免重复表名,这与Elotent的相同。我们的表名称很少更改,而且现在大多数IDE都有相当好的查找/替换功能,所以我不确定这是否会破坏交易。感谢您的回复。在继承类型BaseModel中使用静态函数(对于Traits和Helpers显然是必要的)有什么理由吗?虽然从技术上讲这是可能的,但它创建的代码在某些方面是不一致的——模型中一半的函数将由MyModel->modelFunction调用,另一半由MyModel::modelFunction调用——这是编码中的另一个瓶颈,记住哪些函数在MyModel中,哪些在BaseModel.als中 o感谢关于Eloquent vs Query Builder的建议-我们发现Eloquent对复杂查询的限制太大了-所以我们只使用Query Builder。此外,您可以在QB中使用$this->table来避免重复表名,这与Elotent的相同。我们的表名称很少更改,而且现在大多数IDE都有相当好的查找/替换功能,所以我不确定这是否会破坏交易。