Простым решением, которое я нашел, является создание родительской модели/класса - как указано в this answer на другой вопрос - для текущего примера назовем его BaseModel
.
Для Laravel это хранится вместе с другими моделями, непосредственно в App
каталоге
... в моем случае родительская модель/класс может быть abstract
как это не нужно иметь свой собственный стол (также означая BaseModel
функции могут быть доступны только через дочернюю модель):
namespace App;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
// ...put common model functions here
}
трюк, чтобы получить эту работу (где BaseModel
функции нужно будет получить доступ к таблице на правах ребенка модели) заключается в следующем:
- у каждого детская модель/класс extend
BaseModel
класса
- убедитесь, что $table
определяется во всех дочерних моделях - как отмечено here:
class MyFunkyModel extends BaseModel
{
protected $table = 'funktown';
// ...put child specific functions here
}
что означает $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;
}
}
ли вы найти решение? Я отправил свое решение ниже – Gayan