Eloquent ORM находит по идентификатору и добавляет предложение where в модель отношений

#laravel-4 #eloquent

#laravel-4 #eloquent

Вопрос:

Привет, ребята, как у вас дела? Я пытаюсь просто найти по идентификатору и в то же время гарантировать, что столбец из таблицы отношений имеет значение. Я попробовал несколько вещей, но ничего не работает.

 $tag = Tag::find($id)->whereHas('posts', function($q){
    $q->where('status','=', 1);
})->get();
  

Также:

 $tag = Tag::whereHas('posts', function($q) {
    $q->where('status','=', 1);
})->where('id','=', $id)->get();
  

Можете ли вы мне помочь?

Это простая вещь, но я не могу это сделать…

Ответ №1:

Вам нужно прочитать в Eloquent документах. Узнайте, что такое find , first get если уж на то пошло.

Ваш код делает то, что вам нужно, и даже больше (хотя и немного неправильно) 😉

 $tag = Tag::find($id) // here you fetched the Tag with $id
        ->whereHas('posts', function($q){  // now you start building another query
    $q->where('status','=', 1);
})->get();  // here you fetch collection of Tag models that have related posts.status=1
  

Итак, это то, что вы хотите:

 $tag = Tag::whereHas('posts', function($q){
    $q->where('status','=', 1);
})->find($id);
  

Он вернет Tag модель или null , если нет строки, соответствующей этому where предложению Или заданной $id .

Комментарии:

1. Код не сработал… Верните null, и у меня будет тег… Это единственный способ, которым это работает: [код] $tag = Tag::find($id); $posts = Post::whereHas(‘теги’, функция($ q) использует ($ id) { $ q-> where(‘id’, ‘=’, $id); })-> where(‘статус’, ‘=’, ‘1’)-> get();

2. То, что вы вставили, — это совершенно другой запрос. Тот, который я вам дал, может возвращать значение null, как указано в ответе.

Ответ №2:

Вы проверили область запроса?

Вы можете сделать это:

 $tag = Tag::where('status', '=', 1)
           ->where('id', '=', 1, $id)
           ->get();
  

Комментарии:

1. Поле статуса находится в модели Post… У них есть отношения «многие ко многим»… Я могу получать сообщения из определенного тега, но я хочу получать только сообщения со статусом = 1

2. если вам нужны только сообщения со статусом =1, почему бы вам не использовать Post::where('status', '=', '1') ?

3. Потому что мне нужны сообщения с определенным идентификатором тега

4. Есть ли у вас отношение «один ко многим» между tag и posts ?