【问题标题】:Laravel 5.7 EloquentLaravel 5.7 雄辩
【发布时间】:2023-03-11 15:18:01
【问题描述】:

所以,我在从 Laravel 的数据库中获取一些信息时遇到了一些问题。问题是,我想要一个站点设置表,其中包含一些全局默认值。

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| option_name  | varchar(255) | NO   |     | NULL    |                |
| option_value | longtext     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

像这样.. 我如何使用 Laravel Eloquent 获取所有信息?

select * from `options`;
> 1 | site_name | mysite.com

我希望能够做到

$options->site_name

在我的控制器和视图中。不记得这种东西叫什么了,所以我真的找不到它..:(

编辑:

请求后的模型类

namespace App;

use Illuminate\Database\Eloquent\Model;

class DNBOptions extends Model
{
    protected $table = 'dnb_options';
    protected $primaryKey = 'option_name';

    protected $fillable = [
        'option_name', 'option_value'
    ];
}

编辑 2:

在 Laracast 上得到答案以使用 ->pluck() 并转换为(对象)以获得我正在寻找的结果。

$option->站点名称

Link to Laracast

【问题讨论】:

  • 你已经有 Model 类了吗?所以我可以回答
  • 型号是什么?
  • 用模型更新了我的问题
  • 在 Laravel Eloquent 中,你必须将主键设置为真实表的主键

标签: php laravel eloquent


【解决方案1】:

首先创建模型。您可以手动操作,也可以在终端中使用artisan

php artisan make:model Option

这将创建App\Option 类。然后在app/Option.php中配置Model:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Option extends Model
{
    //
    protected $table = 'options';
}

现在在App\Http\Controllers\AnyController 这样的任何控制器中,您都可以使用代码:

use App\Option;

// Other codes ...

public function show($id) {
    $option = Option::find($id);
    echo $option->option_name; // print "site_name"
}

OP 后编辑给新模型 -------------

所以如果你使用模型:

namespace App;

use Illuminate\Database\Eloquent\Model;

class DNBOptions extends Model
{
    protected $table = 'dnb_options';
    protected $primaryKey = 'option_name';

    protected $fillable = [
        'option_name', 'option_value'
    ];
}

然后在控制器或视图中使用:

$option = \App\DNBOptions::find('site_name');
echo $option->option_value;

// Get all
$options = \App\DNBOptions::all();
foreach($options as $option) {
    echo $option->option_name;
    echo $option->option_value;
}

// Print 1st
echo $options->first()->option_name;

// With where
$option = \App\DNBOptions::where('option_name', 'site_name')->first();
echo $option->option_value;

完整的控制器 - 查看示例:

<?php

namespace App\Http\Controllers;

use App\DNBOptions;

class OptionController extends Controller
{
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $options = DNBOptions::all();
        $data ['options'] => $options;
        return view('options.index', $data);
    }
}

View 类是resources/views/options/index.blade.php

@extends('layouts.app')

@foreach($options as $option)
     {{ $option->site_name }}
     {{ $option->option_value }}
@endforeach

如果您有布局模板,请使用@extends。更多信息请参见 Laravel 文档。

【讨论】:

  • 我不想强制使用 ID。我正在做一个 Option::all() /Option::get() 之后我希望能够使用 $option->site_name
  • 你可以用foreach循环,或者只用-&gt;first()获取第一个
  • 您想在哪个位置执行此操作?哪个视图,只有一个还是多个?
  • 您可以在任何地方使用它,Controller、Model、View,但优先在 Controllers Action(方法)中使用,它将在处理后将值传递给视图。或者只是将一个 $option 对象发送到视图
【解决方案2】:

在您的 App/Http/Controllers/Controller.php 中

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    protected $options;

    public function __construct()
    {
        $this->options = (object)DNBOptions::pluck('option_value', 'option_name')->toArray();
        \View::share('options', $this->options);
    }
}

在视图中:

{{ $options->site_name }}

在控制器中:

$this->options->site_name

【讨论】:

  • 这就是我想要的。我在 Laracast 上得到了使用 ->pluck() 并将其转换为(对象)的答案。结果将是 $options->site_name。谢谢,我会将您的回答标记为我的问题的解决方案
  • 我同意。用 pluck 替换了答案。
【解决方案3】:

雄辩的查询:

$options = DB::table('options')->get();

使用此代码获取所有信息:

@foreach($options as $option)
     {{ $option->site_name }}
     {{ $option->option_value }}
@endforeach

【讨论】:

    【解决方案4】:

    【讨论】:

    • 这不是我想要的。在 DNBOptions 中会有..关于更新的信息(option_name=is_live, option_value=false)等等。静态的东西等等
    • 根据需要展开查询。
    【解决方案5】:

    在Controller中先添加模型命名空间:

    use App\Option;
    
     ....
     ....
    
    public function methodName($id) {
        $data['options'] = Option::all();
        return view('index',$data);
    }
    

    视图位于resources/views/ 目录,名称为 index.blade.php

    或在刀片中:

    @foreach($options as $option)
         {{ $option->site_name }}
         {{ $option->option_value }}
    @endforeach
    

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 2019-03-14
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 2016-09-28
      • 2016-05-08
      相关资源
      最近更新 更多