Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-在何处存储通用模型函数以及如何从控制器访问它们?_Php_Laravel_Model View Controller_Model_Extends - Fatal编程技术网

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都有相当好的查找/替换功能,所以我不确定这是否会破坏交易。