【问题标题】:laravel 5.1 foreach Trying to get property of non-objectlaravel 5.1 foreach 试图获取非对象的属性
【发布时间】:2018-07-14 08:44:44
【问题描述】:

我的代码中每个都有 3-4 个,它们都使用 Eloquent,并且在所有这些代码中我都得到相同的错误

Trying to get property of non-object 

当我 dd foreach 的第一个参数是一个雄辩的时,它返回一个 json 数组,其中包含该表的数据库中的所有数据,因此它不返回 null 虽然我知道它可能会在 foreach 循环中中断或带来 null 但是我不知道将其中一个与模型和控制器放在哪里,所以这是它自己的循环

                                <?php foreach(\App\Menu::all()->where('slug','main')->first()->items as $top_menu): ?>
                                <li class="dropdown">
                                    <a href="<?php echo e(URL($top_menu->link)); ?>" <?php if($top_menu->link_blank): ?> target="_blank" <?php endif; ?>>
                                        <?php echo e($top_menu->title); ?>

                                    </a>
                                </li>
                            <?php endforeach; ?>

这是我的控制器

class MenuItemsController extends AdminController

{

var $object = 'menu_items';
var $route_name = 'menu_items';
var $object_title = 'item';
var $object_titles = 'items';

var $attachments_config = [
    'main_image' => [],
    'default_thumb_sizes' => [],
    'require' => ['main_image']
];

var $dt_fields_db = [];
var $dt_fields_heading = ['شناسه','منو','عنوان','موقعیت','نمایش','ثبت','عملیات'];
var $dt_fields_full = [
    'id' => ['menu_items.id'],
    'menu_title' => ['menus.title'],
    'title' => ['menu_items.title'],
    'position' => ['menu_items.position'],
    'display' => ['menu_items.display'],
    'created_at' => ['menu_items.created_at'],
    'actions' => ['actions']
];

var $messages = array();

public function __construct() {
    parent::__construct();

    view()->share(['attachments_config' => $this->attachments_config]);
}

function index() {

    $data['extra_assets'] = array(
        array('type' => 'css','path' => 'datatables/datatables.bootstrap.css'),
        array('type' => 'js','path' => 'datatables/jquery.dataTables.min.js'),
        array('type' => 'js','path' => 'datatables/datatables.bootstrap.js'),
        array('type' => 'script','path' => 'pagescripts/shared/datatables_script.php'),
    );

    $data['dt_fields_heading'] = $this->dt_fields_heading;
    $data['dt_fields'] = $this->dt_fields_full;

    $data['heading'] = $this->object_titles;
    return view('admin.shared.datatable',$data);
}

function datatable() {
    $this->dt_filtered_actions = dt_actions_filter($this->route_name,['edit','delete']);

    $objects = DB::table('menu_items')
        ->join('menus', 'menu_items.menu_id','=', 'menus.id')
        ->select([
            'menu_items.id',
            'menus.title as menu_title',
            'menu_items.title',
            'menu_items.display',
            'menu_items.position',
            'menu_items.created_at'
        ]);

    return Datatables::of($objects)
        ->editColumn('display', function($model) {return label_status($model->display);})
        ->editColumn('created_at', function($model) {return ($date = jDate::forge($model->created_at)->format('%H:%M:%S - %y/%m/%d'))?$date:"";})
        ->addColumn('actions', function($model) {
            return dt_actions($this->route,$model->id,$this->dt_filtered_actions);
        })
        ->make(true);
}

function add() {

    $data['extra_assets'] = array(
        array('type' => 'js','path' => 'select2/select2.full.min.js'),
        array('type' => 'css','path' => 'select2/select2.min.css'),
        array('type' => 'css','path' => 'select2/select2-bootstrap.css'),
        array('type' => 'helper','name' => 'select2'),
    );

    $data['menus'] = Menu::all()->lists('title','id');

    $data['heading'] = 'add'.$this->object_title;
    return view('admin.'.$this->route_name.'.add',$data);
}

function create(\Illuminate\Http\Request $request) {

    $validator = Validator::make($request->all(), [
        'menu_id' => 'required',
    ]);

    if ($validator->fails()) {
        return back()->withErrors($validator)->withInput();
    }

    $input = $request->all();

    $input['display'] = (isset($input['display']))?$input['display']:0;

    $menu = Menu::find($input['menu_id']);
    if($menu->items->count() == $menu->capacity) {
        $this->messages[] = array('type' => 'danger', 'text' => 'menu is full');
        Session::flash('messages', $this->messages);
        return back();
    }

    MenuItem::create($input);

    $this->messages[] = array('type' => 'success', 'text' => 'success.');
    Session::flash('messages', $this->messages);
    return redirect()->route('admin.'.$this->route_name.'.index');
}

function edit(MenuItem $MenuItem) {
    $data['object'] = $MenuItem;

    $data['extra_assets'] = array(
        array('type' => 'script','path' => 'pagescripts/shared/image_preview_script.php'),

        array('type' => 'js','path' => 'select2/select2.full.min.js'),
        array('type' => 'css','path' => 'select2/select2.min.css'),
        array('type' => 'css','path' => 'select2/select2-bootstrap.css'),
        array('type' => 'helper','name' => 'select2'),

        array('type' => 'js','path' => 'ckeditor/ckeditor.js'),
        array('type' => 'js','path' => 'ckeditor/config.js'),
        array('type' => 'js','path' => 'ckfinder/ckfinder.js'),
        array('type' => 'js','path' => 'ckfinder/config.js'),
        array('type' => 'script','path' => 'pagescripts/shared/ckeditor_script.php'),
    );

    $data['menus'] = Menu::all()->lists('title','id');

    $data['heading'] = 'edit'.$this->object_title;
    return view('admin.'.$this->route_name.'.edit',$data);
}

function update(MenuItem $MenuItem,\Illuminate\Http\Request $request) {

    $validator = Validator::make($request->all(), [
        'menu_id' => 'required',
    ]);

    if ($validator->fails()) {
        return redirect()->back()
            ->withErrors($validator)
            ->withInput();
    }

    $input = $request->all();

    $input['display'] = (isset($input['display']))?$input['display']:0;

    $MenuItem->update($input);

    $this->messages[] = array('type' => 'success', 'text' => 'success.');
    Session::flash('messages', $this->messages);
    return redirect()->back();
}

function delete(\Illuminate\Http\Request $requests,MenuItem $MenuItem) {
    if($requests->ajax() && $MenuItem->delete()) {
        return "OK";
    } else {
        return "ERROR";
    }
}

function deleteall(\Illuminate\Http\Request $requests) {
    $ids = $requests->get('ids');
    if($requests->ajax()) {
        foreach (explode(',',$ids) as $id) {
            if(intval($id)) MenuItem::find($id)->delete();
        }
        return "OK";
    } else {
        return "ERROR";
    }
}

}

【问题讨论】:

  • 请将您的代码缩小到发生错误的行,无需发布控制器的所有代码。
  • 顺便说一句,如果您执行\App\Menu::all()-&gt;where('slug','main')-&gt;first()-&gt;items,您将在内存中加载所有菜单项,过滤您获得的集合,然后从第一个中获取项目。你应该改用\App\Menu::where('slug','main')-&gt;first()-&gt;items()-&gt;get()(你也可以预先加载项目,但在这种情况下没有任何好处)
  • @u_mulder 抱歉,我不知道控制器的哪个部分我做错了
  • @apokryfos 谢谢你,但它可以是导致非对象错误的部分,它可以解决吗?
  • 不,它不会解决这个问题,但这只是一个好习惯。您的错误可能与没有具有 slug=main 的菜单项有关

标签: php laravel-5 foreach


【解决方案1】:

问题是因为我的数据库表没有通过菜单的 slug 获得任何行并且查询返回 null 并且发生该错误通常在您的查询返回 null 时发生错误感谢大家的帮助

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2017-08-20
    • 2015-09-22
    • 2017-03-20
    相关资源
    最近更新 更多