【问题标题】:(Full-Text Search) Trying to get property of non-object(全文搜索)试图获取非对象的属性
【发布时间】:2015-02-17 15:36:38
【问题描述】:

我在那里,我很高兴能在这方面提供一点帮助。我正在尝试在 Laravel 中构建全文搜索功能,并且我几乎实现了我的目标,但突然我停止了从数据库中检索请求的对象。在某些时候,在我不了解具体是什么或何时发生的情况下,代码出现了问题。我刚刚成功地能够按语言检索查询的页面,开始处理其他事情,然后“砰!”..除了“试图获取非对象的属性”错误之外,我什么也得不到.有没有人发现我的逻辑有什么问题,或者有什么错字?我试图通过代码的几次突变来解决这个问题,试图发现任何愚蠢的错误,但还没有运气......

Routes.php

Route::get('{lang}/search/{query}', 'HomeController@searchPages');

HomeController.php

public function searchPages($lang, $query) {

    $cPage = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
                ->where('slug', '=', 'search')
                ->where('code', '=', $lang)
                ->select('langs.*', 'pages.*')
                ->first(array('langs.id AS language_ID'));

    $searchResults = Search::acme($query, $lang);

    return View::make('search.search')
    ->with('cPage', $cPage)
    ->with('searchResults', $searchResults);
}

模型/Page.php

class Page extends Eloquent {

    public function scopeSearch($query, $search) 
    {
        return $query->where(function($query) use ($search) 
        {
            $query->where('title','LIKE', "%$search%")
                  ->orWhere('body', 'LIKE', "%$search%");
        });
    }
} 

Acme/Facades/Search.php

namespace Acme\Facades;

use Illuminate\Support\Facades\Facade;

class Search extends Facade {

    protected static function getFacadeAccessor() 
    {
        return 'search';
    }
}

Acme/Search/SearchServiceProvider.php

namespace Acme\Search;

use Illuminate\Support\ServiceProvider;

class SearchServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('search', 'Acme\Search\Search');
    }
}

Acme/Search/Search.php

namespace Acme\Search;

use Illuminate\Support\Collection;
use Page;

class Search {

    public function pages($search) 
    {
        return Page::search($search)->get();
    }

    public function acme($query, $lang) 
    {
        return new Collection(Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
        ->where('code', '=', $lang)
        ->where('title', 'LIKE', '%'.$query.'%')
        ->orWhere('body', 'LIKE', '%'.$query.'%')
        ->get()
        ->toArray());
    }
}

views/search/search.blade.php

echo $searchResults;

@foreach($searchResults as $searchResult)   

        <div class="search-result-container col-xs-12">
            <div class="col-xs-3 col-sm-2">
                <a href="/{{ $cPage['code'] }}/{{ $searchResult['slug'] }}">
                    <div class="thumbnail" style="background-image: url('{{ $searchResult['image'] }}');"> 
                    </div>
                </a>
            </div>

            <div class="col-xs-9 col-sm-10 search-result-body">
                    <?php
                        $sr = HTML::decode($searchResult['body']) ;

                        $dom = new DOMDocument();
                        $dom->loadHTML($sr);
                        $node = $dom->getElementsByTagName('p')->item(0);
                        $sr_t = $node->nodeValue;
                        $sr_text = HTML::decode(str_limit($sr_t, 150, "..."));

                        $titles = $dom->getElementsByTagName('h1')->item(0);
                        $sr_title = $titles->nodeValue;

                        $title = HTML::decode(str_limit($sr_title, 150, "..."));
                    ?>

                <h3 class="search-result-title">
                    <a href="/{{ $searchResult['code'] }}/{{ $searchResult['slug'] }}">
                        {{ $searchResult['title'] }}
                    </a>
                </h3>
                <p>
                    <?php echo $sr_text; ?>             
                </p>
            </div>
        </div>
        @endforeach

----错误----

试图获取非对象的属性(视图:/Users/.../app/views/search/search.blade.php)

打开:/Users/.../bootstrap/compiled.php

(第 9812 行) { $obLevel = ob_get_level(); ob_start(); 提取($__data); 尝试 { 包括 $__path; } 捕捉 (\Exception $e) { $this->handleViewException($e, $obLevel); } 返回 ltrim(ob_get_clean());

【问题讨论】:

  • 它说哪一行有错误?
  • 我刚刚将错误添加到我的问题中。这对我来说没什么。
  • 视图只有那一行代码?试试 dd($searchResults) 你会得到什么。
  • 嗨乔伊。尝试您的代码我实际上可以检索一个对象...对象(Illuminate\Support\Collection)#220(1){[“items”:protected]=>数组(6){[0]=>数组(19){ ["id"]=> string(1) "1"... 这是否意味着问题出在该行之后的视图代码中?
  • 乔伊。刚刚添加了应该在视图中输出结果的代码。

标签: php laravel full-text-search


【解决方案1】:

改变。

//$searchResult->code to
$searchResult['code']

【讨论】:

  • 嗨,Brian,我刚刚在 HomeController 中添加了变量 $cPage 的代码。它正在那里通过。而且我把$cPage->code和$searchResult->code分别改成了$cPage['code']和$searchResult['code'],没有任何效果...
【解决方案2】:

经过更多尝试,我终于通过在集合查询条件下切换顺序来完成这项工作。 'code'的条件应该在'title'和'body'之后,像这样:

public function marave($search, $lang) 
{
    return new Collection(Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
        ->where('title', 'LIKE', '%'.$search.'%')
        ->orWhere('body', 'LIKE', '%'.$search.'%')
        ->where('code', '=', $lang)
        ->get()
        ->toArray());
}

如果有人能解释一下为什么会发生这种情况,那就太好了;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多