Данные из сводной таблицы через соединения laravel

Привет, я пытаюсь отобразить имена проектов через сводную таблицу tagprojects. К сожалению, я не могу этого понять. Я покажу вам, что я пробовал. Сначала я покажу вам свой контроллер под названием ProjectController.php:

public function get_results($keyword){

    $projects=Project::search2($keyword);
    //die(print_r($tagprojects));

    return View::make('user.projects.results')->with('project', 'Offertes - Zoek resultaten')
    ->with('projects', $projects);
}

Метод search2 () определен в моей модели Project.php:

public static function search2($keyword){
    //return static::DB::table('tagprojects')
    $keyword='ta';
    $result=DB::table('tagprojects')
        ->join('projects', 'tagprojects.id_project', '=', 'projects.id')
        ->join('tags', 'tagprojects.id_tag', '=', 'tags.id')
        ->where('tags.tag_name', 'LIKE', '%'.$keyword.'%')->get();

    /*
    $result=DB::table('tagprojects')
        ->join('projects', 'tagprojects.id_project', '=', 'projects.id')
        ->join('tags', 'tagprojects.id_tag', '=', 'tags.id')
        ->select( 'projects.project_name')
        ->where('projects.project_name', 'LIKE', '%'.$keyword.'%')
        ->where('tags.tag_name', 'LIKE', '%'.$keyword.'%');
     */ 
        //->paginate(3);
        //->get();
    return $result;

}

И вот мой взгляд, который называется results.blade.php:

@foreach ($projects as $tp)
    <li>
    {{$tp->id_tag}}
    {{--    {{$tp->project['project_name']}} --}}
    </li>
@endforeach

Что ж, {{$ tp-> id_tag}} работает, но я действительно хочу видеть названия проектов. И, как вы можете видеть в моем коде, я уже пробовал {{$ tp-> project ['project_name']}}. К сожалению, это не сработало, потому что тогда я получаю следующую ошибку:

Undefined property: stdClass::$project (View: C:\xampp\htdocs\offerteTool\app\views\user\projects\results.blade.php)

Я также пробовал {{$ tp-> project-> project_name}}, но затем получаю ту же ошибку. Но потом я попробовал {{die (print_r ($ projects))}} и получил следующий результат:

Array ( [0] => stdClass Object ( [id] => 6 [id_tag] => 6 [id_project] => 3 [project_name] => Velma [project_description] => Dormouse! Turn that Dormouse out of sight; and an Eaglet, and several other curious creatures. Alice led the way, was the first day,' said the Caterpillar. Alice folded her hands, and began:-- 'You. [hour] => 96 [created_at] => 2014-10-16 08:52:08 [updated_at] => 2014-10-16 08:52:08 [tag_name] => accountancy ) ) 1

Как вы можете видеть, в выходных данных отображается столбец имя_проекта, но по какой-то причине я не могу отобразить столбец имя_проекта. Может кто-то помочь мне, пожалуйста? С удовольствием жду вашего ответа. В любом случае спасибо за ответ.


person superkytoz    schedule 23.10.2014    source источник


Ответы (2)


Вы можете выбрать подходящие проекты следующим образом:

$projects = Project::with('tags')->whereHas('tags', function($q) use ($keyword) {
    $q->where('tag_name', 'LIKE', '%'.$keyword.'%');
});

Вы можете прокручивать проекты в цикле и получать свои теги как обычно. Я предполагаю, что это будет сделано вот так

foreach($projects as $project) {
    $tags = $project->tags;
}

Кроме того, если вы просто хотите загрузить совпадающие теги:

$projects = Project::with(['tags' => function($q) {
    $q->where('tag_name', 'LIKE', '%'.$keyword.'%');
}])->whereHas('tags', function($q) use ($keyword) {
    $q->where('tag_name', 'LIKE', '%'.$keyword.'%');
});

Возможно, есть лучший способ выполнить эту последнюю часть, но я никогда раньше не сталкивался с необходимостью в подобной логике.

person Scopey    schedule 23.10.2014

Я исправил это. Я больше не использую метод get_results (). Потому что теперь я использую только метод post_search () в своем контроллере:

public function post_search()
{

    $keyword=Input::get('keyword');

    if(empty($keyword))
        return Redirect::route('user.projects.index')->with('message', 'No keyword entered, please try again');

    $projects=Project::search3($keyword);

    foreach( $projects as &$project){

        //we initialize projecttask
        $project->projecttask = Projecttask::where('id_project', '=', $project->id)->get();

    };

    //die(print_r($projects));

    return View::make('user.projects.index', compact('projects'));

}

И теперь я использую метод search3 (), который определен в моей модели под названием Project.php (я еще не избежал этого запроса от SQL-инъекции):

public static function search3($keyword){

    $result = DB::Select(DB::raw('SELECT projects.*, tagx.tags_all 
        FROM projects LEFT JOIN (SELECT GROUP_CONCAT(tags.tag_name SEPARATOR ",") 
            AS tags_all, tagprojects.id_project FROM tags JOIN tagprojects 
            on tagprojects.id_tag = tags.id GROUP BY tagprojects.id_project) as tagx 
            ON tagx.id_project = projects.id WHERE projects.project_name 
            LIKE "%'.$keyword.'%" OR tags_all LIKE "%'.$keyword.'%"'));

    return $result;


}
person superkytoz    schedule 26.10.2014